Commit 0a5ec96a authored by Christian Lamparter's avatar Christian Lamparter Committed by John W. Linville

p54: remove free_on_tx parameter

This patch simplifies the tx code a bit and will be necessary for
the upcoming stlc45xx<->p54 port.

In detail: we no longer have to tell all back-end drivers directly,
if we want to free a frame right after it was send to the firmware,
or if we do it in the library callback later.
Signed-off-by: default avatarChristian Lamparter <chunkeey@web.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 69ba3e5d
...@@ -44,6 +44,9 @@ enum p54_control_frame_types { ...@@ -44,6 +44,9 @@ enum p54_control_frame_types {
P54_CONTROL_TYPE_BT_OPTIONS = 35 P54_CONTROL_TYPE_BT_OPTIONS = 35
}; };
#define P54_HDR_FLAG_CONTROL BIT(15)
#define P54_HDR_FLAG_CONTROL_OPSET (BIT(15) + BIT(0))
struct p54_hdr { struct p54_hdr {
__le16 flags; __le16 flags;
__le16 len; __le16 len;
...@@ -54,6 +57,10 @@ struct p54_hdr { ...@@ -54,6 +57,10 @@ struct p54_hdr {
u8 data[0]; u8 data[0];
} __attribute__ ((packed)); } __attribute__ ((packed));
#define FREE_AFTER_TX(skb) \
((((struct p54_hdr *) ((struct sk_buff *) skb)->data)-> \
flags) == cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET))
struct p54_edcf_queue_param { struct p54_edcf_queue_param {
__le16 aifs; __le16 aifs;
__le16 cwmin; __le16 cwmin;
...@@ -82,8 +89,7 @@ struct p54_common { ...@@ -82,8 +89,7 @@ struct p54_common {
u32 rx_start; u32 rx_start;
u32 rx_end; u32 rx_end;
struct sk_buff_head tx_queue; struct sk_buff_head tx_queue;
void (*tx)(struct ieee80211_hw *dev, struct sk_buff *skb, void (*tx)(struct ieee80211_hw *dev, struct sk_buff *skb);
int free_on_tx);
int (*open)(struct ieee80211_hw *dev); int (*open)(struct ieee80211_hw *dev);
void (*stop)(struct ieee80211_hw *dev); void (*stop)(struct ieee80211_hw *dev);
int mode; int mode;
......
...@@ -683,7 +683,7 @@ void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb) ...@@ -683,7 +683,7 @@ void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb)
freed = priv->rx_end - last_addr; freed = priv->rx_end - last_addr;
__skb_unlink(skb, &priv->tx_queue); __skb_unlink(skb, &priv->tx_queue);
spin_unlock_irqrestore(&priv->tx_queue.lock, flags); spin_unlock_irqrestore(&priv->tx_queue.lock, flags);
kfree_skb(skb); dev_kfree_skb_any(skb);
if (freed >= priv->headroom + sizeof(struct p54_hdr) + 48 + if (freed >= priv->headroom + sizeof(struct p54_hdr) + 48 +
IEEE80211_MAX_RTS_THRESHOLD + priv->tailroom) IEEE80211_MAX_RTS_THRESHOLD + priv->tailroom)
...@@ -1088,7 +1088,7 @@ int p54_read_eeprom(struct ieee80211_hw *dev) ...@@ -1088,7 +1088,7 @@ int p54_read_eeprom(struct ieee80211_hw *dev)
eeprom_hdr->v2.magic2 = 0xf; eeprom_hdr->v2.magic2 = 0xf;
memcpy(eeprom_hdr->v2.magic, (const char *)"LOCK", 4); memcpy(eeprom_hdr->v2.magic, (const char *)"LOCK", 4);
} }
priv->tx(dev, skb, 0); priv->tx(dev, skb);
if (!wait_for_completion_interruptible_timeout(&priv->eeprom_comp, HZ)) { if (!wait_for_completion_interruptible_timeout(&priv->eeprom_comp, HZ)) {
printk(KERN_ERR "%s: device does not respond!\n", printk(KERN_ERR "%s: device does not respond!\n",
...@@ -1129,7 +1129,7 @@ static int p54_set_tim(struct ieee80211_hw *dev, struct ieee80211_sta *sta, ...@@ -1129,7 +1129,7 @@ static int p54_set_tim(struct ieee80211_hw *dev, struct ieee80211_sta *sta,
tim = (struct p54_tim *) skb_put(skb, sizeof(*tim)); tim = (struct p54_tim *) skb_put(skb, sizeof(*tim));
tim->count = 1; tim->count = 1;
tim->entry[0] = cpu_to_le16(set ? (sta->aid | 0x8000) : sta->aid); tim->entry[0] = cpu_to_le16(set ? (sta->aid | 0x8000) : sta->aid);
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1147,7 +1147,7 @@ static int p54_sta_unlock(struct ieee80211_hw *dev, u8 *addr) ...@@ -1147,7 +1147,7 @@ static int p54_sta_unlock(struct ieee80211_hw *dev, u8 *addr)
sta = (struct p54_sta_unlock *)skb_put(skb, sizeof(*sta)); sta = (struct p54_sta_unlock *)skb_put(skb, sizeof(*sta));
memcpy(sta->addr, addr, ETH_ALEN); memcpy(sta->addr, addr, ETH_ALEN);
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1190,7 +1190,7 @@ static int p54_tx_cancel(struct ieee80211_hw *dev, struct sk_buff *entry) ...@@ -1190,7 +1190,7 @@ static int p54_tx_cancel(struct ieee80211_hw *dev, struct sk_buff *entry)
hdr = (void *)entry->data; hdr = (void *)entry->data;
cancel = (struct p54_txcancel *)skb_put(skb, sizeof(*cancel)); cancel = (struct p54_txcancel *)skb_put(skb, sizeof(*cancel));
cancel->req_id = hdr->req_id; cancel->req_id = hdr->req_id;
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1419,7 +1419,7 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) ...@@ -1419,7 +1419,7 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
/* modifies skb->cb and with it info, so must be last! */ /* modifies skb->cb and with it info, so must be last! */
if (unlikely(p54_assign_address(dev, skb, hdr, skb->len + tim_len))) if (unlikely(p54_assign_address(dev, skb, hdr, skb->len + tim_len)))
goto err; goto err;
priv->tx(dev, skb, 0); priv->tx(dev, skb);
queue_delayed_work(dev->workqueue, &priv->work, queue_delayed_work(dev->workqueue, &priv->work,
msecs_to_jiffies(P54_TX_FRAME_LIFETIME)); msecs_to_jiffies(P54_TX_FRAME_LIFETIME));
...@@ -1498,7 +1498,7 @@ static int p54_setup_mac(struct ieee80211_hw *dev) ...@@ -1498,7 +1498,7 @@ static int p54_setup_mac(struct ieee80211_hw *dev)
setup->v2.lpf_bandwidth = cpu_to_le16(65535); setup->v2.lpf_bandwidth = cpu_to_le16(65535);
setup->v2.osc_start_delay = cpu_to_le16(65535); setup->v2.osc_start_delay = cpu_to_le16(65535);
} }
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1579,7 +1579,7 @@ static int p54_scan(struct ieee80211_hw *dev, u16 mode, u16 dwell) ...@@ -1579,7 +1579,7 @@ static int p54_scan(struct ieee80211_hw *dev, u16 mode, u16 dwell)
chan->v2.basic_rate_mask = cpu_to_le32(priv->basic_rate_mask); chan->v2.basic_rate_mask = cpu_to_le32(priv->basic_rate_mask);
memset(chan->v2.rts_rates, 0, 8); memset(chan->v2.rts_rates, 0, 8);
} }
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
err: err:
...@@ -1605,7 +1605,7 @@ static int p54_set_leds(struct ieee80211_hw *dev, int mode, int link, int act) ...@@ -1605,7 +1605,7 @@ static int p54_set_leds(struct ieee80211_hw *dev, int mode, int link, int act)
led->led_permanent = cpu_to_le16(link); led->led_permanent = cpu_to_le16(link);
led->led_temporary = cpu_to_le16(act); led->led_temporary = cpu_to_le16(act);
led->duration = cpu_to_le16(1000); led->duration = cpu_to_le16(1000);
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1645,7 +1645,7 @@ static int p54_set_edcf(struct ieee80211_hw *dev) ...@@ -1645,7 +1645,7 @@ static int p54_set_edcf(struct ieee80211_hw *dev)
edcf->flags = 0; edcf->flags = 0;
memset(edcf->mapping, 0, sizeof(edcf->mapping)); memset(edcf->mapping, 0, sizeof(edcf->mapping));
memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue));
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1936,7 +1936,7 @@ static int p54_init_xbow_synth(struct ieee80211_hw *dev) ...@@ -1936,7 +1936,7 @@ static int p54_init_xbow_synth(struct ieee80211_hw *dev)
xbow->magic2 = cpu_to_le16(0x2); xbow->magic2 = cpu_to_le16(0x2);
xbow->freq = cpu_to_le16(5390); xbow->freq = cpu_to_le16(5390);
memset(xbow->padding, 0, sizeof(xbow->padding)); memset(xbow->padding, 0, sizeof(xbow->padding));
priv->tx(dev, skb, 1); priv->tx(dev, skb);
return 0; return 0;
} }
...@@ -1962,7 +1962,7 @@ static void p54_work(struct work_struct *work) ...@@ -1962,7 +1962,7 @@ static void p54_work(struct work_struct *work)
if (!skb) if (!skb)
return ; return ;
priv->tx(dev, skb, 0); priv->tx(dev, skb);
} }
static int p54_get_stats(struct ieee80211_hw *dev, static int p54_get_stats(struct ieee80211_hw *dev,
...@@ -2094,7 +2094,7 @@ static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd, ...@@ -2094,7 +2094,7 @@ static int p54_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY]), 8); [NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY]), 8);
} }
priv->tx(dev, skb, 1); priv->tx(dev, skb);
mutex_unlock(&priv->conf_mutex); mutex_unlock(&priv->conf_mutex);
return 0; return 0;
} }
......
...@@ -84,9 +84,6 @@ struct bootrec_desc { ...@@ -84,9 +84,6 @@ struct bootrec_desc {
#define BR_CODE_END_OF_BRA 0xFF0000FF #define BR_CODE_END_OF_BRA 0xFF0000FF
#define LEGACY_BR_CODE_END_OF_BRA 0xFFFFFFFF #define LEGACY_BR_CODE_END_OF_BRA 0xFFFFFFFF
#define P54_HDR_FLAG_CONTROL BIT(15)
#define P54_HDR_FLAG_CONTROL_OPSET (BIT(15) + BIT(0))
#define P54_HDR_FLAG_DATA_ALIGN BIT(14) #define P54_HDR_FLAG_DATA_ALIGN BIT(14)
#define P54_HDR_FLAG_DATA_OUT_PROMISC BIT(0) #define P54_HDR_FLAG_DATA_OUT_PROMISC BIT(0)
#define P54_HDR_FLAG_DATA_OUT_TIMESTAMP BIT(1) #define P54_HDR_FLAG_DATA_OUT_TIMESTAMP BIT(1)
......
...@@ -227,6 +227,8 @@ static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index, ...@@ -227,6 +227,8 @@ static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index,
while (i != idx) { while (i != idx) {
desc = &ring[i]; desc = &ring[i];
if (tx_buf[i])
if (FREE_AFTER_TX((struct sk_buff *) tx_buf[i]))
p54_free_skb(dev, tx_buf[i]); p54_free_skb(dev, tx_buf[i]);
tx_buf[i] = NULL; tx_buf[i] = NULL;
...@@ -298,8 +300,7 @@ static irqreturn_t p54p_interrupt(int irq, void *dev_id) ...@@ -298,8 +300,7 @@ static irqreturn_t p54p_interrupt(int irq, void *dev_id)
return reg ? IRQ_HANDLED : IRQ_NONE; return reg ? IRQ_HANDLED : IRQ_NONE;
} }
static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb, static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
int free_on_tx)
{ {
struct p54p_priv *priv = dev->priv; struct p54p_priv *priv = dev->priv;
struct p54p_ring_control *ring_control = priv->ring_control; struct p54p_ring_control *ring_control = priv->ring_control;
...@@ -314,6 +315,7 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -314,6 +315,7 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
idx = le32_to_cpu(ring_control->host_idx[1]); idx = le32_to_cpu(ring_control->host_idx[1]);
i = idx % ARRAY_SIZE(ring_control->tx_data); i = idx % ARRAY_SIZE(ring_control->tx_data);
priv->tx_buf_data[i] = skb;
mapping = pci_map_single(priv->pdev, skb->data, skb->len, mapping = pci_map_single(priv->pdev, skb->data, skb->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
desc = &ring_control->tx_data[i]; desc = &ring_control->tx_data[i];
...@@ -324,10 +326,6 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -324,10 +326,6 @@ static void p54p_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
wmb(); wmb();
ring_control->host_idx[1] = cpu_to_le32(idx + 1); ring_control->host_idx[1] = cpu_to_le32(idx + 1);
if (free_on_tx)
priv->tx_buf_data[i] = skb;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
......
...@@ -138,21 +138,15 @@ static void p54u_rx_cb(struct urb *urb) ...@@ -138,21 +138,15 @@ static void p54u_rx_cb(struct urb *urb)
} }
} }
static void p54u_tx_reuse_skb_cb(struct urb *urb) static void p54u_tx_cb(struct urb *urb)
{
struct sk_buff *skb = urb->context;
struct p54u_priv *priv = (struct p54u_priv *)((struct ieee80211_hw *)
usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)))->priv;
skb_pull(skb, priv->common.tx_hdr_len);
}
static void p54u_tx_free_skb_cb(struct urb *urb)
{ {
struct sk_buff *skb = urb->context; struct sk_buff *skb = urb->context;
struct ieee80211_hw *dev = (struct ieee80211_hw *) struct ieee80211_hw *dev = (struct ieee80211_hw *)
usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)); usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
struct p54u_priv *priv = dev->priv;
skb_pull(skb, priv->common.tx_hdr_len);
if (FREE_AFTER_TX(skb))
p54_free_skb(dev, skb); p54_free_skb(dev, skb);
} }
...@@ -213,8 +207,7 @@ static int p54u_init_urbs(struct ieee80211_hw *dev) ...@@ -213,8 +207,7 @@ static int p54u_init_urbs(struct ieee80211_hw *dev)
return ret; return ret;
} }
static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb)
int free_on_tx)
{ {
struct p54u_priv *priv = dev->priv; struct p54u_priv *priv = dev->priv;
struct urb *addr_urb, *data_urb; struct urb *addr_urb, *data_urb;
...@@ -236,9 +229,7 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -236,9 +229,7 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb,
p54u_tx_dummy_cb, dev); p54u_tx_dummy_cb, dev);
usb_fill_bulk_urb(data_urb, priv->udev, usb_fill_bulk_urb(data_urb, priv->udev,
usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
skb->data, skb->len, skb->data, skb->len, p54u_tx_cb, skb);
free_on_tx ? p54u_tx_free_skb_cb :
p54u_tx_reuse_skb_cb, skb);
usb_anchor_urb(addr_urb, &priv->submitted); usb_anchor_urb(addr_urb, &priv->submitted);
err = usb_submit_urb(addr_urb, GFP_ATOMIC); err = usb_submit_urb(addr_urb, GFP_ATOMIC);
...@@ -273,8 +264,7 @@ static __le32 p54u_lm87_chksum(const __le32 *data, size_t length) ...@@ -273,8 +264,7 @@ static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)
return cpu_to_le32(chk); return cpu_to_le32(chk);
} }
static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb, static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
int free_on_tx)
{ {
struct p54u_priv *priv = dev->priv; struct p54u_priv *priv = dev->priv;
struct urb *data_urb; struct urb *data_urb;
...@@ -293,9 +283,7 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -293,9 +283,7 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb,
usb_fill_bulk_urb(data_urb, priv->udev, usb_fill_bulk_urb(data_urb, priv->udev,
usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
skb->data, skb->len, skb->data, skb->len, p54u_tx_cb, skb);
free_on_tx ? p54u_tx_free_skb_cb :
p54u_tx_reuse_skb_cb, skb);
usb_anchor_urb(data_urb, &priv->submitted); usb_anchor_urb(data_urb, &priv->submitted);
if (usb_submit_urb(data_urb, GFP_ATOMIC)) { if (usb_submit_urb(data_urb, GFP_ATOMIC)) {
...@@ -306,8 +294,7 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -306,8 +294,7 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb,
usb_free_urb(data_urb); usb_free_urb(data_urb);
} }
static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
int free_on_tx)
{ {
struct p54u_priv *priv = dev->priv; struct p54u_priv *priv = dev->priv;
struct urb *int_urb, *data_urb; struct urb *int_urb, *data_urb;
...@@ -354,9 +341,7 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -354,9 +341,7 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb,
usb_fill_bulk_urb(data_urb, priv->udev, usb_fill_bulk_urb(data_urb, priv->udev,
usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
skb->data, skb->len, skb->data, skb->len, p54u_tx_cb, skb);
free_on_tx ? p54u_tx_free_skb_cb :
p54u_tx_reuse_skb_cb, skb);
usb_anchor_urb(int_urb, &priv->submitted); usb_anchor_urb(int_urb, &priv->submitted);
err = usb_submit_urb(int_urb, GFP_ATOMIC); err = usb_submit_urb(int_urb, GFP_ATOMIC);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment