summaryrefslogtreecommitdiffstats
path: root/sbin/ifconfig
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2014-08-29 18:02:58 +0000
committermelifaro <melifaro@FreeBSD.org>2014-08-29 18:02:58 +0000
commit69a7dea554e8ce785a94c7019ded96d47838221d (patch)
tree8ee519c5a538e208bc426e87f4b4f6c03d4a9fda /sbin/ifconfig
parent5fa46aaa7491aa347cb56b2883c175d05c9c553c (diff)
downloadFreeBSD-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/ifconfig')
-rw-r--r--sbin/ifconfig/sfp.c54
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]);
OpenPOWER on IntegriCloud