Skip to content

Commit 101d598

Browse files
ilanpeer2gregkh
authored andcommitted
wifi: iwlwifi: pcie: Fix TSO preparation
commit bbb18f7 upstream. The allocation of the scatter gather data structure should be done based on the number of memory chunks that need to be mapped, and it is not dependent on the overall payload length. Fix it. In addition, as the skb_to_sgvec() function returns an 'int' do not assign it to an 'unsigned int' as otherwise the error check would be useless. Fixes: 7f5e303 ("wifi: iwlwifi: map entire SKB when sending AMSDUs") Signed-off-by: Ilan Peer <ilan.peer@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250306122425.8c0e23a3d583.I3cb4d6768c9d28ce3da6cd0a6c65466176cfc1ee@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f41ec24 commit 101d598

1 file changed

Lines changed: 6 additions & 5 deletions

File tree

  • drivers/net/wireless/intel/iwlwifi/pcie

drivers/net/wireless/intel/iwlwifi/pcie/tx.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1867,12 +1867,12 @@ struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
18671867
unsigned int offset)
18681868
{
18691869
struct sg_table *sgt;
1870-
unsigned int n_segments;
1870+
unsigned int n_segments = skb_shinfo(skb)->nr_frags + 1;
1871+
int orig_nents;
18711872

18721873
if (WARN_ON_ONCE(skb_has_frag_list(skb)))
18731874
return NULL;
18741875

1875-
n_segments = DIV_ROUND_UP(skb->len - offset, skb_shinfo(skb)->gso_size);
18761876
*hdr = iwl_pcie_get_page_hdr(trans,
18771877
hdr_room + __alignof__(struct sg_table) +
18781878
sizeof(struct sg_table) +
@@ -1887,11 +1887,12 @@ struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
18871887
sg_init_table(sgt->sgl, n_segments);
18881888

18891889
/* Only map the data, not the header (it is copied to the TSO page) */
1890-
sgt->orig_nents = skb_to_sgvec(skb, sgt->sgl, offset,
1891-
skb->len - offset);
1892-
if (WARN_ON_ONCE(sgt->orig_nents <= 0))
1890+
orig_nents = skb_to_sgvec(skb, sgt->sgl, offset, skb->len - offset);
1891+
if (WARN_ON_ONCE(orig_nents <= 0))
18931892
return NULL;
18941893

1894+
sgt->orig_nents = orig_nents;
1895+
18951896
/* And map the entire SKB */
18961897
if (dma_map_sgtable(trans->dev, sgt, DMA_TO_DEVICE, 0) < 0)
18971898
return NULL;

0 commit comments

Comments
 (0)