aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/fddi/defza.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/fddi/defza.c')
-rw-r--r--drivers/net/fddi/defza.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/drivers/net/fddi/defza.c b/drivers/net/fddi/defza.c
index 7d01b70f7ed8..3b7f10a5f06a 100644
--- a/drivers/net/fddi/defza.c
+++ b/drivers/net/fddi/defza.c
@@ -797,11 +797,40 @@ static void fza_tx_smt(struct net_device *dev)
797 smt_tx_ptr = fp->mmio + readl_u(&fp->ring_smt_tx[i].buffer); 797 smt_tx_ptr = fp->mmio + readl_u(&fp->ring_smt_tx[i].buffer);
798 len = readl_u(&fp->ring_smt_tx[i].rmc) & FZA_RING_PBC_MASK; 798 len = readl_u(&fp->ring_smt_tx[i].rmc) & FZA_RING_PBC_MASK;
799 799
800 /* Queue the frame to the RMC transmit ring. */ 800 if (!netif_queue_stopped(dev)) {
801 if (!netif_queue_stopped(dev)) 801 if (dev_nit_active(dev)) {
802 struct sk_buff *skb;
803
804 /* Length must be a multiple of 4 as only word
805 * reads are permitted!
806 */
807 skb = fza_alloc_skb_irq(dev, (len + 3) & ~3);
808 if (!skb)
809 goto err_no_skb; /* Drop. */
810
811 skb_data_ptr = (struct fza_buffer_tx *)
812 skb->data;
813
814 fza_reads(smt_tx_ptr, skb_data_ptr,
815 (len + 3) & ~3);
816 skb->dev = dev;
817 skb_reserve(skb, 3); /* Skip over PRH. */
818 skb_put(skb, len - 3);
819 skb_reset_network_header(skb);
820
821 dev_queue_xmit_nit(skb, dev);
822
823 dev_kfree_skb_irq(skb);
824
825err_no_skb:
826 ;
827 }
828
829 /* Queue the frame to the RMC transmit ring. */
802 fza_do_xmit((union fza_buffer_txp) 830 fza_do_xmit((union fza_buffer_txp)
803 { .mmio_ptr = smt_tx_ptr }, 831 { .mmio_ptr = smt_tx_ptr },
804 len, dev, 1); 832 len, dev, 1);
833 }
805 834
806 writel_o(FZA_RING_OWN_FZA, &fp->ring_smt_tx[i].own); 835 writel_o(FZA_RING_OWN_FZA, &fp->ring_smt_tx[i].own);
807 fp->ring_smt_tx_index = 836 fp->ring_smt_tx_index =