diff options
Diffstat (limited to 'sys/net')
| -rw-r--r-- | sys/net/if.h | 5 | ||||
| -rw-r--r-- | sys/net/iflib.c | 9 | ||||
| -rw-r--r-- | sys/net/iflib.h | 5 |
3 files changed, 16 insertions, 3 deletions
diff --git a/sys/net/if.h b/sys/net/if.h index 7c0a476708d6..1b47237e46bb 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -604,8 +604,9 @@ struct ifi2creq { uint8_t dev_addr; /* i2c address (0xA0, 0xA2) */ uint8_t offset; /* read offset */ uint8_t len; /* read length */ - uint8_t spare0; - uint32_t spare1; + uint8_t page; /* CMIS page number (0 for legacy) */ + uint8_t bank; /* CMIS bank number (0 for legacy) */ + uint8_t spare[3]; /* reserved for future use */ uint8_t data[8]; /* read buffer */ }; diff --git a/sys/net/iflib.c b/sys/net/iflib.c index 08282d1799b8..f9d0b1af0f83 100644 --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -4468,8 +4468,11 @@ iflib_if_ioctl(if_t ifp, u_long command, caddr_t data) err = ifmedia_ioctl(ifp, ifr, ctx->ifc_mediap, command); break; case SIOCGI2C: + /* FALLTHROUGH */ + case SIOCGI2CPB: { struct ifi2creq i2c; + if_shared_ctx_t sctx = ctx->ifc_sctx; err = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (err != 0) @@ -4482,6 +4485,12 @@ iflib_if_ioctl(if_t ifp, u_long command, caddr_t data) err = EINVAL; break; } + if (command == SIOCGI2C) { + i2c.page = i2c.bank = 0; + } else if ((sctx->isc_flags & IFLIB_I2C_PAGE_BANK) == 0) { + err = EINVAL; + break; + } if ((err = IFDI_I2C_REQ(ctx, &i2c)) == 0) err = copyout(&i2c, ifr_data_get_ptr(ifr), diff --git a/sys/net/iflib.h b/sys/net/iflib.h index fe70fc5775cd..c73c50e5a3b3 100644 --- a/sys/net/iflib.h +++ b/sys/net/iflib.h @@ -348,7 +348,10 @@ typedef enum { * Driver needs frames padded to some minimum length */ #define IFLIB_NEED_ETHER_PAD 0x100 -#define IFLIB_SPARE7 0x200 +/* + * Driver understands page/bank i2c reads + */ +#define IFLIB_I2C_PAGE_BANK 0x200 #define IFLIB_SPARE6 0x400 #define IFLIB_SPARE5 0x800 #define IFLIB_SPARE4 0x1000 |
