Patch #3 - Add a new ioctl to access SFP+ module diagnostic

data via the I2C routines in shared code.
This commit is contained in:
Jack F Vogel 2012-11-30 22:41:32 +00:00
parent 35bbbdaa3b
commit 6a59dfbb86
2 changed files with 28 additions and 2 deletions

View File

@ -47,7 +47,7 @@ int ixgbe_display_debug_stats = 0;
/********************************************************************* /*********************************************************************
* Driver version * Driver version
*********************************************************************/ *********************************************************************/
char ixgbe_driver_version[] = "2.5.0 - 2"; char ixgbe_driver_version[] = "2.5.0 - 3";
/********************************************************************* /*********************************************************************
* PCI Device ID Table * PCI Device ID Table
@ -919,6 +919,7 @@ static int
ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data) ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
{ {
struct adapter *adapter = ifp->if_softc; struct adapter *adapter = ifp->if_softc;
struct ixgbe_hw *hw = &adapter->hw;
struct ifreq *ifr = (struct ifreq *) data; struct ifreq *ifr = (struct ifreq *) data;
#if defined(INET) || defined(INET6) #if defined(INET) || defined(INET6)
struct ifaddr *ifa = (struct ifaddr *)data; struct ifaddr *ifa = (struct ifaddr *)data;
@ -1024,7 +1025,22 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
VLAN_CAPABILITIES(ifp); VLAN_CAPABILITIES(ifp);
break; 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: default:
IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command); IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command);
error = ether_ioctl(ifp, command, data); error = ether_ioctl(ifp, command, data);

View File

@ -199,6 +199,9 @@
#define IXGBE_BR_SIZE 4096 #define IXGBE_BR_SIZE 4096
#define IXGBE_QUEUE_MIN_FREE 32 #define IXGBE_QUEUE_MIN_FREE 32
/* IOCTL define to gather SFP+ Diagnostic data */
#define SIOCGI2C SIOCGIFGENERIC
/* Offload bits in mbuf flag */ /* Offload bits in mbuf flag */
#if __FreeBSD_version >= 800000 #if __FreeBSD_version >= 800000
#define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP) #define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
@ -241,6 +244,13 @@ typedef struct _ixgbe_vendor_info_t {
unsigned int index; unsigned int index;
} ixgbe_vendor_info_t; } 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 { struct ixgbe_tx_buf {
u32 eop_index; u32 eop_index;