aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00debug.c
diff options
context:
space:
mode:
authorGertjan van Wingerde <gwingerde@gmail.com>2010-05-11 17:51:43 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-05-12 16:50:52 -0400
commitfd76f148ebc67d662f71f00128c8ddb0538168c0 (patch)
tree24abb0f0cdcd1ff1961324b32ce0a2602548ee7e /drivers/net/wireless/rt2x00/rt2x00debug.c
parent185e5f77f891d5bc7a0d8c8eb2b1edf6c317edab (diff)
rt2x00: In debugfs frame dumping allow the TX descriptor to be part of the skb.
Preparation for futher cleanups in the area of properly maintaining the skb data without fiddling with the skb->data pointer. Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> Acked-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00debug.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00debug.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c
index 9e2eed51e167..1e81eef9ca1a 100644
--- a/drivers/net/wireless/rt2x00/rt2x00debug.c
+++ b/drivers/net/wireless/rt2x00/rt2x00debug.c
@@ -159,6 +159,7 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
159 struct sk_buff *skbcopy; 159 struct sk_buff *skbcopy;
160 struct rt2x00dump_hdr *dump_hdr; 160 struct rt2x00dump_hdr *dump_hdr;
161 struct timeval timestamp; 161 struct timeval timestamp;
162 u32 data_len;
162 163
163 do_gettimeofday(&timestamp); 164 do_gettimeofday(&timestamp);
164 165
@@ -170,7 +171,11 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
170 return; 171 return;
171 } 172 }
172 173
173 skbcopy = alloc_skb(sizeof(*dump_hdr) + skbdesc->desc_len + skb->len, 174 data_len = skb->len;
175 if (skbdesc->flags & SKBDESC_DESC_IN_SKB)
176 data_len -= skbdesc->desc_len;
177
178 skbcopy = alloc_skb(sizeof(*dump_hdr) + skbdesc->desc_len + data_len,
174 GFP_ATOMIC); 179 GFP_ATOMIC);
175 if (!skbcopy) { 180 if (!skbcopy) {
176 DEBUG(rt2x00dev, "Failed to copy skb for dump.\n"); 181 DEBUG(rt2x00dev, "Failed to copy skb for dump.\n");
@@ -181,7 +186,7 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
181 dump_hdr->version = cpu_to_le32(DUMP_HEADER_VERSION); 186 dump_hdr->version = cpu_to_le32(DUMP_HEADER_VERSION);
182 dump_hdr->header_length = cpu_to_le32(sizeof(*dump_hdr)); 187 dump_hdr->header_length = cpu_to_le32(sizeof(*dump_hdr));
183 dump_hdr->desc_length = cpu_to_le32(skbdesc->desc_len); 188 dump_hdr->desc_length = cpu_to_le32(skbdesc->desc_len);
184 dump_hdr->data_length = cpu_to_le32(skb->len); 189 dump_hdr->data_length = cpu_to_le32(data_len);
185 dump_hdr->chip_rt = cpu_to_le16(rt2x00dev->chip.rt); 190 dump_hdr->chip_rt = cpu_to_le16(rt2x00dev->chip.rt);
186 dump_hdr->chip_rf = cpu_to_le16(rt2x00dev->chip.rf); 191 dump_hdr->chip_rf = cpu_to_le16(rt2x00dev->chip.rf);
187 dump_hdr->chip_rev = cpu_to_le16(rt2x00dev->chip.rev); 192 dump_hdr->chip_rev = cpu_to_le16(rt2x00dev->chip.rev);
@@ -191,8 +196,9 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
191 dump_hdr->timestamp_sec = cpu_to_le32(timestamp.tv_sec); 196 dump_hdr->timestamp_sec = cpu_to_le32(timestamp.tv_sec);
192 dump_hdr->timestamp_usec = cpu_to_le32(timestamp.tv_usec); 197 dump_hdr->timestamp_usec = cpu_to_le32(timestamp.tv_usec);
193 198
194 memcpy(skb_put(skbcopy, skbdesc->desc_len), skbdesc->desc, 199 if (!(skbdesc->flags & SKBDESC_DESC_IN_SKB))
195 skbdesc->desc_len); 200 memcpy(skb_put(skbcopy, skbdesc->desc_len), skbdesc->desc,
201 skbdesc->desc_len);
196 memcpy(skb_put(skbcopy, skb->len), skb->data, skb->len); 202 memcpy(skb_put(skbcopy, skb->len), skb->data, skb->len);
197 203
198 skb_queue_tail(&intf->frame_dump_skbqueue, skbcopy); 204 skb_queue_tail(&intf->frame_dump_skbqueue, skbcopy);