{
return hip4_smapper_get_skb(sdev, &sdev->hip4_inst, skb);
}
+
+void *slsi_hip_get_skb_data_from_smapper(struct slsi_dev *sdev, struct sk_buff *skb)
+{
+ return hip4_smapper_get_skb_data(sdev, &sdev->hip4_inst, skb);
+}
#endif
int slsi_hip_stop(struct slsi_dev *sdev)
int slsi_hip_start(struct slsi_dev *sdev);
int slsi_hip_setup(struct slsi_dev *sdev);
int slsi_hip_consume_smapper_entry(struct slsi_dev *sdev, struct sk_buff *skb);
+void *slsi_hip_get_skb_data_from_smapper(struct slsi_dev *sdev, struct sk_buff *skb);
struct sk_buff *slsi_hip_get_skb_from_smapper(struct slsi_dev *sdev, struct sk_buff *skb);
int slsi_hip_stop(struct slsi_dev *sdev);
return -EIO;
}
+void *hip4_smapper_get_skb_data(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi)
+{
+ struct sk_buff *skb;
+ struct slsi_skb_cb *cb = slsi_skb_cb_get(skb_fapi);
+ struct hip4_smapper_control *control;
+ unsigned long flags;
+
+ control = &(hip->hip_priv->smapper_control);
+
+ spin_lock_irqsave(&control->smapper_lock, flags);
+ skb = (struct sk_buff *)cb->skb_addr;
+
+ SLSI_DBG4_NODEV(SLSI_SMAPPER, "Get SKB smapper: 0x%p, SKB fapi 0x%p\n", skb, skb_fapi);
+ spin_unlock_irqrestore(&control->smapper_lock, flags);
+
+ return skb->data;
+}
+
struct sk_buff *hip4_smapper_get_skb(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi)
{
struct sk_buff *skb;
struct mbulk *hip4_smapper_send(struct slsi_hip4 *hip, struct sk_buff *skb, int *val);
int hip4_smapper_consume_entry(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi);
+void *hip4_smapper_get_skb_data(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi);
struct sk_buff *hip4_smapper_get_skb(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi);
#endif
{
struct netdev_vif *ndev_vif = netdev_priv(dev);
struct slsi_peer *peer = NULL;
- struct ethhdr *ehdr = (struct ethhdr *)fapi_get_data((*skb));
+ struct ethhdr *ehdr;
u16 seq_num;
bool skip_ba = from_ba;
bool is_amsdu = slsi_rx_is_amsdu((*skb));
u8 trafic_q = slsi_frame_priority_to_ac_queue(fapi_get_u16((*skb), u.ma_unitdata_ind.priority));
+#ifdef CONFIG_SCSC_SMAPPER
+ /* Check if the payload is in the SMAPPER entry */
+ if (fapi_get_u16((*skb), u.ma_unitdata_ind.bulk_data_descriptor) == FAPI_BULKDATADESCRIPTOR_SMAPPER) {
+ ehdr = (struct ethhdr *)slsi_hip_get_skb_data_from_smapper(sdev, (*skb));
+ if (!(ehdr)) {
+ SLSI_NET_DBG2(dev, SLSI_RX, "SKB from SMAPPER is NULL\n");
+ return -EINVAL;
+ }
+ } else {
+ ehdr = (struct ethhdr *)fapi_get_data((*skb));
+ }
+#else
+ ehdr = (struct ethhdr *)fapi_get_data((*skb));
+#endif
+
SLSI_NET_DBG_HEX(dev, SLSI_RX, (*skb)->data, (*skb)->len < 64 ? (*skb)->len : 64, "\n");
if (!((fapi_get_u16((*skb), u.ma_unitdata_ind.data_unit_descriptor) == FAPI_DATAUNITDESCRIPTOR_IEEE802_3_FRAME) ||