diff options
author | melifaro <melifaro@FreeBSD.org> | 2014-08-29 18:02:58 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2014-08-29 18:02:58 +0000 |
commit | 69a7dea554e8ce785a94c7019ded96d47838221d (patch) | |
tree | 8ee519c5a538e208bc426e87f4b4f6c03d4a9fda /sbin | |
parent | 5fa46aaa7491aa347cb56b2883c175d05c9c553c (diff) | |
download | FreeBSD-src-69a7dea554e8ce785a94c7019ded96d47838221d.zip FreeBSD-src-69a7dea554e8ce785a94c7019ded96d47838221d.tar.gz |
* Add SIOCGI2C driver ioctl used to retrieve i2c info.
* Convert ixgbe to use this ioctl
* Convert ifconfig to use generic i2c handler for "ix" interfaces.
Approved by: Eric Joyner (ixgbe part)
MFC after: 2 weeks
Sponsored by: Yandex LLC
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/ifconfig/sfp.c | 54 |
1 files changed, 21 insertions, 33 deletions
diff --git a/sbin/ifconfig/sfp.c b/sbin/ifconfig/sfp.c index 9647eb3..d85d4d8 100644 --- a/sbin/ifconfig/sfp.c +++ b/sbin/ifconfig/sfp.c @@ -624,55 +624,43 @@ get_qsfp_tx_power(struct i2c_info *ii, char *buf, size_t size, int chan) convert_sff_power(ii, buf, size, xbuf); } -/* Intel ixgbe-specific structures and handlers */ -struct ixgbe_i2c_req { - uint8_t dev_addr; - uint8_t offset; - uint8_t len; - uint8_t data[8]; -}; -#define SIOCGI2C SIOCGIFGENERIC - +/* Generic handler */ static int -read_i2c_ixgbe(struct i2c_info *ii, uint8_t addr, uint8_t off, uint8_t len, +read_i2c_generic(struct i2c_info *ii, uint8_t addr, uint8_t off, uint8_t len, caddr_t buf) { - struct ixgbe_i2c_req ixreq; - int i; + struct ifi2creq req; + int i, l; if (ii->error != 0) return (ii->error); - ii->ifr->ifr_data = (caddr_t)&ixreq; + ii->ifr->ifr_data = (caddr_t)&req; - memset(&ixreq, 0, sizeof(ixreq)); - ixreq.dev_addr = addr; - - for (i = 0; i < len; i += 1) { - ixreq.offset = off + i; - ixreq.len = 1; - ixreq.data[0] = '\0'; + i = 0; + l = 0; + memset(&req, 0, sizeof(req)); + req.dev_addr = addr; + req.offset = off; + req.len = len; + while (len > 0) { + l = (len > sizeof(req.data)) ? sizeof(req.data) : len; + req.len = l; if (ioctl(ii->s, SIOCGI2C, ii->ifr) != 0) { ii->error = errno; return (errno); } - memcpy(&buf[i], ixreq.data, 1); + + memcpy(&buf[i], req.data, l); + len -= l; + i += l; + req.offset += l; } return (0); } -/* Generic handler */ -static int -read_i2c_generic(struct i2c_info *ii, uint8_t addr, uint8_t off, uint8_t len, - caddr_t buf) -{ - - ii->error = EINVAL; - return (-1); -} - static void print_qsfp_status(struct i2c_info *ii, int verbose) { @@ -766,6 +754,7 @@ sfp_status(int s, struct ifreq *ifr, int verbose) { struct i2c_info ii; + memset(&ii, 0, sizeof(ii)); /* Prepare necessary into to pass to NIC handler */ ii.s = s; ii.ifr = ifr; @@ -774,9 +763,8 @@ sfp_status(int s, struct ifreq *ifr, int verbose) * Check if we have i2c support for particular driver. * TODO: Determine driver by original name. */ - memset(&ii, 0, sizeof(ii)); if (strncmp(ifr->ifr_name, "ix", 2) == 0) { - ii.f = read_i2c_ixgbe; + ii.f = read_i2c_generic; print_sfp_status(&ii, verbose); } else if (strncmp(ifr->ifr_name, "cxl", 3) == 0) { ii.port_id = atoi(&ifr->ifr_name[3]); |