summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjfv <jfv@FreeBSD.org>2012-11-30 22:41:32 +0000
committerjfv <jfv@FreeBSD.org>2012-11-30 22:41:32 +0000
commit6b9e611792ee4f48ab4641666945e218339e3da7 (patch)
tree46b7eee970c27750e0fe4c22042ef281abbedb25
parent80b1e3c11a8669b594b04bbf14358a75c69c6117 (diff)
downloadFreeBSD-src-6b9e611792ee4f48ab4641666945e218339e3da7.zip
FreeBSD-src-6b9e611792ee4f48ab4641666945e218339e3da7.tar.gz
Patch #3 - Add a new ioctl to access SFP+ module diagnostic
data via the I2C routines in shared code.
-rw-r--r--sys/dev/ixgbe/ixgbe.c20
-rw-r--r--sys/dev/ixgbe/ixgbe.h10
2 files changed, 28 insertions, 2 deletions
diff --git a/sys/dev/ixgbe/ixgbe.c b/sys/dev/ixgbe/ixgbe.c
index 40a1dc0..b1c905a 100644
--- a/sys/dev/ixgbe/ixgbe.c
+++ b/sys/dev/ixgbe/ixgbe.c
@@ -47,7 +47,7 @@ int ixgbe_display_debug_stats = 0;
/*********************************************************************
* Driver version
*********************************************************************/
-char ixgbe_driver_version[] = "2.5.0 - 2";
+char ixgbe_driver_version[] = "2.5.0 - 3";
/*********************************************************************
* PCI Device ID Table
@@ -919,6 +919,7 @@ static int
ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
{
struct adapter *adapter = ifp->if_softc;
+ struct ixgbe_hw *hw = &adapter->hw;
struct ifreq *ifr = (struct ifreq *) data;
#if defined(INET) || defined(INET6)
struct ifaddr *ifa = (struct ifaddr *)data;
@@ -1024,7 +1025,22 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
VLAN_CAPABILITIES(ifp);
break;
}
-
+ case SIOCGI2C:
+ {
+ struct ixgbe_i2c_req i2c;
+ IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
+ error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
+ if (error)
+ break;
+ if ((i2c.dev_addr != 0xA0) || (i2c.dev_addr != 0xA2)){
+ error = EINVAL;
+ break;
+ }
+ hw->phy.ops.read_i2c_byte(hw, i2c.offset,
+ i2c.dev_addr, i2c.data);
+ error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
+ break;
+ }
default:
IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command);
error = ether_ioctl(ifp, command, data);
diff --git a/sys/dev/ixgbe/ixgbe.h b/sys/dev/ixgbe/ixgbe.h
index 25d364d..fa00239 100644
--- a/sys/dev/ixgbe/ixgbe.h
+++ b/sys/dev/ixgbe/ixgbe.h
@@ -199,6 +199,9 @@
#define IXGBE_BR_SIZE 4096
#define IXGBE_QUEUE_MIN_FREE 32
+/* IOCTL define to gather SFP+ Diagnostic data */
+#define SIOCGI2C SIOCGIFGENERIC
+
/* Offload bits in mbuf flag */
#if __FreeBSD_version >= 800000
#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
@@ -241,6 +244,13 @@ typedef struct _ixgbe_vendor_info_t {
unsigned int index;
} ixgbe_vendor_info_t;
+/* This is used to get SFP+ module data */
+struct ixgbe_i2c_req {
+ u8 dev_addr;
+ u8 offset;
+ u8 len;
+ u8 data[8];
+};
struct ixgbe_tx_buf {
u32 eop_index;
OpenPOWER on IntegriCloud