aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if.h5
-rw-r--r--sys/net/iflib.c9
-rw-r--r--sys/net/iflib.h5
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