diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c')
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c | 44 | 
1 files changed, 22 insertions, 22 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c index 4ec9811f49c8..898c3801e658 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c @@ -73,8 +73,10 @@  #define BRCMF_MSGBUF_TX_FLUSH_CNT1		32  #define BRCMF_MSGBUF_TX_FLUSH_CNT2		96 -#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS	64 +#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS	96  #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS	32 +#define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS		48 +  struct msgbuf_common_hdr {  	u8				msgtype; @@ -278,16 +280,6 @@ struct brcmf_msgbuf_pktids {  	struct brcmf_msgbuf_pktid *array;  }; - -/* dma flushing needs implementation for mips and arm platforms. Should - * be put in util. Note, this is not real flushing. It is virtual non - * cached memory. Only write buffers should have to be drained. Though - * this may be different depending on platform...... - */ -#define brcmf_dma_flush(addr, len) -#define brcmf_dma_invalidate_cache(addr, len) - -  static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf); @@ -462,7 +454,6 @@ static int brcmf_msgbuf_tx_ioctl(struct brcmf_pub *drvr, int ifidx,  		memcpy(msgbuf->ioctbuf, buf, buf_len);  	else  		memset(msgbuf->ioctbuf, 0, buf_len); -	brcmf_dma_flush(ioctl_buf, buf_len);  	err = brcmf_commonring_write_complete(commonring);  	brcmf_commonring_unlock(commonring); @@ -511,11 +502,9 @@ static int brcmf_msgbuf_query_dcmd(struct brcmf_pub *drvr, int ifidx,  				     msgbuf->rx_pktids,  				     msgbuf->ioctl_resp_pktid);  	if (msgbuf->ioctl_resp_ret_len != 0) { -		if (!skb) { -			brcmf_err("Invalid packet id idx recv'd %d\n", -				  msgbuf->ioctl_resp_pktid); +		if (!skb)  			return -EBADF; -		} +  		memcpy(buf, skb->data, (len < msgbuf->ioctl_resp_ret_len) ?  				       len : msgbuf->ioctl_resp_ret_len);  	} @@ -797,6 +786,8 @@ static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,  	struct brcmf_flowring *flow = msgbuf->flow;  	struct ethhdr *eh = (struct ethhdr *)(skb->data);  	u32 flowid; +	u32 queue_count; +	bool force;  	flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);  	if (flowid == BRCMF_FLOWRING_INVALID_ID) { @@ -804,8 +795,9 @@ static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,  		if (flowid == BRCMF_FLOWRING_INVALID_ID)  			return -ENOMEM;  	} -	brcmf_flowring_enqueue(flow, flowid, skb); -	brcmf_msgbuf_schedule_txdata(msgbuf, flowid, false); +	queue_count = brcmf_flowring_enqueue(flow, flowid, skb); +	force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0); +	brcmf_msgbuf_schedule_txdata(msgbuf, flowid, force);  	return 0;  } @@ -874,10 +866,8 @@ brcmf_msgbuf_process_txstatus(struct brcmf_msgbuf *msgbuf, void *buf)  	flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;  	skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,  				     msgbuf->tx_pktids, idx); -	if (!skb) { -		brcmf_err("Invalid packet id idx recv'd %d\n", idx); +	if (!skb)  		return; -	}  	set_bit(flowid, msgbuf->txstatus_done_map);  	commonring = msgbuf->flowrings[flowid]; @@ -1156,6 +1146,8 @@ brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf)  	skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,  				     msgbuf->rx_pktids, idx); +	if (!skb) +		return;  	if (data_offset)  		skb_pull(skb, data_offset); @@ -1267,19 +1259,27 @@ static void brcmf_msgbuf_process_rx(struct brcmf_msgbuf *msgbuf,  {  	void *buf;  	u16 count; +	u16 processed;  again:  	buf = brcmf_commonring_get_read_ptr(commonring, &count);  	if (buf == NULL)  		return; +	processed = 0;  	while (count) {  		brcmf_msgbuf_process_msgtype(msgbuf,  					     buf + msgbuf->rx_dataoffset);  		buf += brcmf_commonring_len_item(commonring); +		processed++; +		if (processed == BRCMF_MSGBUF_UPDATE_RX_PTR_THRS) { +			brcmf_commonring_read_complete(commonring, processed); +			processed = 0; +		}  		count--;  	} -	brcmf_commonring_read_complete(commonring); +	if (processed) +		brcmf_commonring_read_complete(commonring, processed);  	if (commonring->r_ptr == 0)  		goto again;  |