diff options
author | Inaky Perez-Gonzalez <inaky@linux.intel.com> | 2009-02-28 18:42:52 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-02 06:10:26 -0500 |
commit | fd5c565c0c04d2716cfdac3f1de3c2261d6a457d (patch) | |
tree | 0f64176368c6ffb5b4f95abf37b422bfba7fdd6e /drivers/net/wimax/i2400m/control.c | |
parent | 347707baa77d273d79258303e00200d40cf3b323 (diff) |
wimax/i2400m: support extended data RX protocol (no need to reallocate skbs)
Newer i2400m firmwares (>= v1.4) extend the data RX protocol so that
each packet has a 16 byte header. This header is mainly used to
implement host reordeing (which is addressed in later commits).
However, this header also allows us to overwrite it (once data has
been extracted) with an Ethernet header and deliver to the networking
stack without having to reallocate the skb (as it happened in fw <=
v1.3) to make room for it.
- control.c: indicate the device [dev_initialize()] that the driver
wants to use the extended data RX protocol. Also involves adding the
definition of the needed data types in include/linux/wimax/i2400m.h.
- rx.c: handle the new payload type for the extended RX data
protocol. Prepares the skb for delivery to
netdev.c:i2400m_net_erx().
- netdev.c: Introduce i2400m_net_erx() that adds the fake ethernet
address to a prepared skb and delivers it to the networking
stack.
- cleanup: in most instances in rx.c, the variable 'single' was
renamed to 'single_last' for it better conveys its meaning.
Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wimax/i2400m/control.c')
-rw-r--r-- | drivers/net/wimax/i2400m/control.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/wimax/i2400m/control.c b/drivers/net/wimax/i2400m/control.c index c3968b240d69..4073c3e93bd4 100644 --- a/drivers/net/wimax/i2400m/control.c +++ b/drivers/net/wimax/i2400m/control.c | |||
@@ -1311,6 +1311,7 @@ int i2400m_dev_initialize(struct i2400m *i2400m) | |||
1311 | struct device *dev = i2400m_dev(i2400m); | 1311 | struct device *dev = i2400m_dev(i2400m); |
1312 | struct i2400m_tlv_config_idle_parameters idle_params; | 1312 | struct i2400m_tlv_config_idle_parameters idle_params; |
1313 | struct i2400m_tlv_config_idle_timeout idle_timeout; | 1313 | struct i2400m_tlv_config_idle_timeout idle_timeout; |
1314 | struct i2400m_tlv_config_d2h_data_format df; | ||
1314 | const struct i2400m_tlv_hdr *args[9]; | 1315 | const struct i2400m_tlv_hdr *args[9]; |
1315 | unsigned argc = 0; | 1316 | unsigned argc = 0; |
1316 | 1317 | ||
@@ -1333,6 +1334,14 @@ int i2400m_dev_initialize(struct i2400m *i2400m) | |||
1333 | args[argc++] = &idle_timeout.hdr; | 1334 | args[argc++] = &idle_timeout.hdr; |
1334 | } | 1335 | } |
1335 | } | 1336 | } |
1337 | if (i2400m_ge_v1_4(i2400m)) { | ||
1338 | df.hdr.type = | ||
1339 | cpu_to_le16(I2400M_TLV_CONFIG_D2H_DATA_FORMAT); | ||
1340 | df.hdr.length = cpu_to_le16( | ||
1341 | sizeof(df) - sizeof(df.hdr)); | ||
1342 | df.format = 1; | ||
1343 | args[argc++] = &df.hdr; | ||
1344 | } | ||
1336 | result = i2400m_set_init_config(i2400m, args, argc); | 1345 | result = i2400m_set_init_config(i2400m, args, argc); |
1337 | if (result < 0) | 1346 | if (result < 0) |
1338 | goto error; | 1347 | goto error; |