Author: jfv
Date: Fri Nov 30 22:41:32 2012
New Revision: 243718
URL: http://svnweb.freebsd.org/changeset/base/243718

Log:
  Patch #3 - Add a new ioctl to access SFP+ module diagnostic
             data via the I2C routines in shared code.

Modified:
  head/sys/dev/ixgbe/ixgbe.c
  head/sys/dev/ixgbe/ixgbe.h

Modified: head/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.c  Fri Nov 30 22:38:42 2012        (r243717)
+++ head/sys/dev/ixgbe/ixgbe.c  Fri Nov 30 22:41:32 2012        (r243718)
@@ -47,7 +47,7 @@ int             ixgbe_display_debug_stat
 /*********************************************************************
  *  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 c
                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);

Modified: head/sys/dev/ixgbe/ixgbe.h
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.h  Fri Nov 30 22:38:42 2012        (r243717)
+++ head/sys/dev/ixgbe/ixgbe.h  Fri Nov 30 22:41:32 2012        (r243718)
@@ -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;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to