/** * request_netinfo - triggers retrieving of network info * @iface: pointer to the interface * @channel_id: corresponding channel ID * * Send a command to INIC which triggers retrieving of network info by means of * "Message exchange over MDP/MEP". Return 0 on success, negative on failure. */ static void request_netinfo(struct most_interface *most_iface, int ch_idx, void (*on_netinfo)(struct most_interface *, unsigned char, unsigned char *)) { struct dim2_hdm *dev = iface_to_hdm(most_iface); struct mbo *mbo; u8 *data; dev->on_netinfo = on_netinfo; if (!on_netinfo) return; if (dev->atx_idx < 0) { pr_err("Async Tx Not initialized\n"); return; } mbo = most_get_mbo(&dev->most_iface, dev->atx_idx, NULL); if (!mbo) return; mbo->buffer_length = 5; data = mbo->virt_address; data[0] = 0x00; /* PML High byte */ data[1] = 0x03; /* PML Low byte */ data[2] = 0x02; /* PMHL */ data[3] = 0x08; /* FPH */ data[4] = 0x40; /* FMF (FIFO cmd msg - Triggers NAOverMDP) */ most_submit_mbo(mbo); }
static netdev_tx_t most_nd_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct net_dev_context *nd = netdev_priv(dev); struct mbo *mbo; int ret; mbo = most_get_mbo(nd->iface, nd->tx.ch_id, &comp); if (!mbo) { netif_stop_queue(dev); dev->stats.tx_fifo_errors++; return NETDEV_TX_BUSY; } if (nd->is_mamac) ret = skb_to_mamac(skb, mbo); else ret = skb_to_mep(skb, mbo); if (ret) { most_put_mbo(mbo); dev->stats.tx_dropped++; kfree_skb(skb); return NETDEV_TX_OK; } most_submit_mbo(mbo); dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; kfree_skb(skb); return NETDEV_TX_OK; }