Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9ea7d6cb authored by Jeff Garzik's avatar Jeff Garzik
Browse files

Merge branch 'fixes-jgarzik' of...

Merge branch 'fixes-jgarzik' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 into upstream-fixes
parents 94d43363 c5d0dc5f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -257,7 +257,7 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev,
				      __le32 *mac)
{
	rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, &mac,
	rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, mac,
				      (3 * sizeof(__le16)));
}

+16 −4
Original line number Diff line number Diff line
@@ -124,7 +124,10 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
	struct data_entry *entry;
	struct data_desc *rxd;
	struct sk_buff *skb;
	struct ieee80211_hdr *hdr;
	struct rxdata_entry_desc desc;
	int header_size;
	int align;
	u32 word;

	while (1) {
@@ -138,17 +141,26 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
		memset(&desc, 0x00, sizeof(desc));
		rt2x00dev->ops->lib->fill_rxdone(entry, &desc);

		hdr = (struct ieee80211_hdr *)entry->data_addr;
		header_size =
		    ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));

		/*
		 * The data behind the ieee80211 header must be
		 * aligned on a 4 byte boundary.
		 */
		align = NET_IP_ALIGN + (2 * (header_size % 4 == 0));

		/*
		 * Allocate the sk_buffer, initialize it and copy
		 * all data into it.
		 */
		skb = dev_alloc_skb(desc.size + NET_IP_ALIGN);
		skb = dev_alloc_skb(desc.size + align);
		if (!skb)
			return;

		skb_reserve(skb, NET_IP_ALIGN);
		skb_put(skb, desc.size);
		memcpy(skb->data, entry->data_addr, desc.size);
		skb_reserve(skb, align);
		memcpy(skb_put(skb, desc.size), entry->data_addr, desc.size);

		/*
		 * Send the frame to rt2x00lib for further processing.
+15 −2
Original line number Diff line number Diff line
@@ -221,7 +221,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
	struct data_ring *ring = entry->ring;
	struct rt2x00_dev *rt2x00dev = ring->rt2x00dev;
	struct sk_buff *skb;
	struct ieee80211_hdr *hdr;
	struct rxdata_entry_desc desc;
	int header_size;
	int frame_size;

	if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
@@ -253,9 +255,20 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
	skb_put(skb, frame_size);

	/*
	 * Trim the skb_buffer to only contain the valid
	 * frame data (so ignore the device's descriptor).
	 * The data behind the ieee80211 header must be
	 * aligned on a 4 byte boundary.
	 * After that trim the entire buffer down to only
	 * contain the valid frame data excluding the device
	 * descriptor.
	 */
	hdr = (struct ieee80211_hdr *)entry->skb->data;
	header_size =
	    ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));

	if (header_size % 4 == 0) {
		skb_push(entry->skb, 2);
		memmove(entry->skb->data, entry->skb->data + 2, skb->len - 2);
	}
	skb_trim(entry->skb, desc.size);

	/*
+12 −0
Original line number Diff line number Diff line
@@ -1738,6 +1738,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
{
	struct data_ring *ring;
	struct data_entry *entry;
	struct data_entry *entry_done;
	struct data_desc *txd;
	u32 word;
	u32 reg;
@@ -1791,6 +1792,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
		    !rt2x00_get_field32(word, TXD_W0_VALID))
			return;

		entry_done = rt2x00_get_data_entry_done(ring);
		while (entry != entry_done) {
			/* Catch up. Just report any entries we missed as
			 * failed. */
			WARNING(rt2x00dev,
				"TX status report missed for entry %p\n",
				entry_done);
			rt2x00lib_txdone(entry_done, TX_FAIL_OTHER, 0);
			entry_done = rt2x00_get_data_entry_done(ring);
		}

		/*
		 * Obtain the status about this packet.
		 */