wifi: iwlwifi: pcie: Fix TSO preparation
commitbbb18f7e23upstream. 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:7f5e3038f0("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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8031772e5a
commit
52b0eb50f8
@@ -1867,12 +1867,12 @@ struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
unsigned int offset)
|
||||
{
|
||||
struct sg_table *sgt;
|
||||
unsigned int n_segments;
|
||||
unsigned int n_segments = skb_shinfo(skb)->nr_frags + 1;
|
||||
int orig_nents;
|
||||
|
||||
if (WARN_ON_ONCE(skb_has_frag_list(skb)))
|
||||
return NULL;
|
||||
|
||||
n_segments = DIV_ROUND_UP(skb->len - offset, skb_shinfo(skb)->gso_size);
|
||||
*hdr = iwl_pcie_get_page_hdr(trans,
|
||||
hdr_room + __alignof__(struct sg_table) +
|
||||
sizeof(struct sg_table) +
|
||||
@@ -1887,11 +1887,12 @@ struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
sg_init_table(sgt->sgl, n_segments);
|
||||
|
||||
/* Only map the data, not the header (it is copied to the TSO page) */
|
||||
sgt->orig_nents = skb_to_sgvec(skb, sgt->sgl, offset,
|
||||
skb->len - offset);
|
||||
if (WARN_ON_ONCE(sgt->orig_nents <= 0))
|
||||
orig_nents = skb_to_sgvec(skb, sgt->sgl, offset, skb->len - offset);
|
||||
if (WARN_ON_ONCE(orig_nents <= 0))
|
||||
return NULL;
|
||||
|
||||
sgt->orig_nents = orig_nents;
|
||||
|
||||
/* And map the entire SKB */
|
||||
if (dma_map_sgtable(trans->dev, sgt, DMA_TO_DEVICE, 0) < 0)
|
||||
return NULL;
|
||||
|
||||
Reference in New Issue
Block a user