netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] (5/8) farsync - hdlc_device conversion
@ 2003-12-02 22:02 Stephen Hemminger
  0 siblings, 0 replies; only message in thread
From: Stephen Hemminger @ 2003-12-02 22:02 UTC (permalink / raw)
  To: Krzysztof Halas, Jeff Garzik; +Cc: netdev

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.1494  -> 1.1495 
#	drivers/net/wan/farsync.c	1.18    -> 1.19   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/11/26	shemminger@osdl.org	1.1495
# Convert from embedding hdlc_device (with embedded net_device)
# to hdlc_device pointer.
# --------------------------------------------
#
diff -Nru a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c
--- a/drivers/net/wan/farsync.c	Wed Nov 26 12:31:27 2003
+++ b/drivers/net/wan/farsync.c	Wed Nov 26 12:31:28 2003
@@ -328,7 +328,7 @@
 /*      Per port (line or channel) information
  */
 struct fst_port_info {
-        hdlc_device             hdlc;   /* HDLC device struct - must be first */
+        hdlc_device            *hdlc;   /* HDLC device struct */
         struct fst_card_info   *card;   /* Card we're associated with */
         int                     index;  /* Port index on the card */
         int                     hwif;   /* Line hardware (lineInterface copy) */
@@ -353,13 +353,16 @@
         spinlock_t     card_lock;       /* Lock for SMP access */
         unsigned short pci_conf;        /* PCI card config in I/O space */
                                         /* Per port info */
-        struct fst_port_info ports[ FST_MAX_PORTS ];
+        struct fst_port_info *ports[ FST_MAX_PORTS ];
 };
 
 /* Convert an HDLC device pointer into a port info pointer and similar */
-#define hdlc_to_port(H) ((struct fst_port_info *)(H))
+static __inline__ struct fst_port_info *hdlc_to_port(hdlc_device *hdlc)
+{
+	return hdlc->dev_data;
+}
 #define dev_to_port(D)  hdlc_to_port(dev_to_hdlc(D))
-#define port_to_dev(P)  hdlc_to_dev(&(P)->hdlc)
+#define port_to_dev(P)	hdlc_to_dev(P->hdlc)
 
 
 /*
@@ -678,24 +681,24 @@
                                         len );
         if ( dmabits != ( RX_STP | RX_ENP ) || len > LEN_RX_BUFFER - 2 )
         {
-                port->hdlc.stats.rx_errors++;
+                port->hdlc->stats.rx_errors++;
 
                 /* Update error stats and discard buffer */
                 if ( dmabits & RX_OFLO )
                 {
-                        port->hdlc.stats.rx_fifo_errors++;
+                        port->hdlc->stats.rx_fifo_errors++;
                 }
                 if ( dmabits & RX_CRC )
                 {
-                        port->hdlc.stats.rx_crc_errors++;
+                        port->hdlc->stats.rx_crc_errors++;
                 }
                 if ( dmabits & RX_FRAM )
                 {
-                        port->hdlc.stats.rx_frame_errors++;
+                        port->hdlc->stats.rx_frame_errors++;
                 }
                 if ( dmabits == ( RX_STP | RX_ENP ))
                 {
-                        port->hdlc.stats.rx_length_errors++;
+                        port->hdlc->stats.rx_length_errors++;
                 }
 
                 /* Discard buffer descriptors until we see the end of packet
@@ -732,7 +735,7 @@
         {
                 dbg ( DBG_RX,"intr_rx: can't allocate buffer\n");
 
-                port->hdlc.stats.rx_dropped++;
+                port->hdlc->stats.rx_dropped++;
 
                 /* Return descriptor to card */
                 FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
@@ -756,12 +759,12 @@
                 port->rxpos = rxp;
 
         /* Update stats */
-        port->hdlc.stats.rx_packets++;
-        port->hdlc.stats.rx_bytes += len;
+        port->hdlc->stats.rx_packets++;
+        port->hdlc->stats.rx_bytes += len;
 
         /* Push upstream */
         skb->mac.raw = skb->data;
-        skb->dev = hdlc_to_dev ( &port->hdlc );
+        skb->dev = hdlc_to_dev ( port->hdlc );
         skb->protocol = hdlc_type_trans(skb, skb->dev);
         netif_rx ( skb );
 
@@ -806,7 +809,7 @@
         {
                 event = FST_RDB ( card, interruptEvent.evntbuff[rdidx]);
 
-                port = &card->ports[event & 0x03];
+                port = card->ports[event & 0x03];
 
                 dbg ( DBG_INTR,"intr: %x\n", event );
 
@@ -835,8 +838,8 @@
                          * always load up the entire packet for DMA.
                          */
                         dbg ( DBG_TX,"Tx underflow port %d\n", event & 0x03 );
-                        port->hdlc.stats.tx_errors++;
-                        port->hdlc.stats.tx_fifo_errors++;
+                        port->hdlc->stats.tx_errors++;
+                        port->hdlc->stats.tx_fifo_errors++;
                         break;
 
                 case INIT_CPLT:
@@ -859,9 +862,10 @@
         }
         FST_WRB ( card, interruptEvent.rdindex, rdidx );
 
-        for ( pi = 0, port = card->ports ; pi < card->nports ; pi++, port++ )
+        for ( pi = 0 ; pi < card->nports ; pi++ )
         {
-                if ( ! port->run )
+		port = card->ports[pi];
+                if ( !port || ! port->run )
                         continue;
 
                 /* Check for rx completions */
@@ -1346,8 +1350,8 @@
 
         port = dev_to_port ( dev );
 
-        port->hdlc.stats.tx_errors++;
-        port->hdlc.stats.tx_aborted_errors++;
+        port->hdlc->stats.tx_errors++;
+        port->hdlc->stats.tx_aborted_errors++;
 
         if ( port->txcnt > 0 )
                 fst_issue_cmd ( port, ABORTTX );
@@ -1374,8 +1378,8 @@
         if ( ! netif_carrier_ok ( dev ))
         {
                 dev_kfree_skb ( skb );
-                port->hdlc.stats.tx_errors++;
-                port->hdlc.stats.tx_carrier_errors++;
+                port->hdlc->stats.tx_errors++;
+                port->hdlc->stats.tx_carrier_errors++;
                 return 0;
         }
 
@@ -1385,7 +1389,7 @@
                 dbg ( DBG_TX,"Packet too large %d vs %d\n", skb->len,
                                                 LEN_TX_BUFFER );
                 dev_kfree_skb ( skb );
-                port->hdlc.stats.tx_errors++;
+                port->hdlc->stats.tx_errors++;
                 return 0;
         }
 
@@ -1399,7 +1403,7 @@
                 spin_unlock_irqrestore ( &card->card_lock, flags );
                 dbg ( DBG_TX,"Out of Tx buffers\n");
                 dev_kfree_skb ( skb );
-                port->hdlc.stats.tx_errors++;
+                port->hdlc->stats.tx_errors++;
                 return 0;
         }
         if ( ++port->txpos >= NUM_TX_BUFFER )
@@ -1419,8 +1423,8 @@
         FST_WRW ( card, txDescrRing[pi][txp].bcnt, cnv_bcnt ( skb->len ));
         FST_WRB ( card, txDescrRing[pi][txp].bits, DMA_OWN | TX_STP | TX_ENP );
 
-        port->hdlc.stats.tx_packets++;
-        port->hdlc.stats.tx_bytes += skb->len;
+        port->hdlc->stats.tx_packets++;
+        port->hdlc->stats.tx_bytes += skb->len;
 
         dev_kfree_skb ( skb );
 
@@ -1455,11 +1459,23 @@
          */
         for ( i = 0 ; i < card->nports ; i++ )
         {
-                card->ports[i].card   = card;
-                card->ports[i].index  = i;
-                card->ports[i].run    = 0;
+		hdlc_device *hdlc;
+		struct fst_port_info *port;
+
+		hdlc = alloc_hdlc_device(sizeof(*port));
+		if (!hdlc) {
+                        printk_err ("Cannot allcoate HDLC device for port %d", i);
+                        card->nports = i;
+                        break;
+		}
 
-                dev = hdlc_to_dev ( &card->ports[i].hdlc );
+		card->ports[i] = port = hdlc->dev_data;
+		port->hdlc = hdlc;
+                port->card   = card;
+                port->index  = i;
+                port->run    = 0;
+
+                dev = hdlc_to_dev ( hdlc );
 
                 /* Fill in the net device info */
                                 /* Since this is a PCI setup this is purely
@@ -1479,10 +1495,11 @@
                 dev->do_ioctl              = fst_ioctl;
                 dev->watchdog_timeo        = FST_TX_TIMEOUT;
                 dev->tx_timeout            = fst_tx_timeout;
-                card->ports[i].hdlc.attach = fst_attach;
-                card->ports[i].hdlc.xmit   = fst_start_xmit;
+                hdlc->attach	 	   = fst_attach;
+                hdlc->xmit  		   = fst_start_xmit;
 
-                if (( err = register_hdlc_device ( &card->ports[i].hdlc )) < 0 )
+		err = register_hdlc_device ( hdlc );
+		if (err)
                 {
                         printk_err ("Cannot register HDLC device for port %d"
                                     " (errno %d)\n", i, -err );
@@ -1494,8 +1511,8 @@
         spin_lock_init ( &card->card_lock );
 
         printk ( KERN_INFO "%s-%s: %s IRQ%d, %d ports\n",
-                        hdlc_to_dev(&card->ports[0].hdlc)->name,
-                        hdlc_to_dev(&card->ports[card->nports-1].hdlc)->name,
+                        hdlc_to_dev(card->ports[0]->hdlc)->name,
+                        hdlc_to_dev(card->ports[card->nports-1]->hdlc)->name,
                         type_strings[card->type], card->irq, card->nports );
 }
 
@@ -1641,13 +1658,14 @@
 fst_remove_one ( struct pci_dev *pdev )
 {
         struct fst_card_info *card;
-        int i;
+	int i;
 
         card = pci_get_drvdata(pdev);
 
-        for ( i = 0 ; i < card->nports ; i++ )
-        {
-                unregister_hdlc_device ( &card->ports[i].hdlc );
+        for ( i = 0 ; i < card->nports ; i++ ) {
+		hdlc_device *hdlc = card->ports[i]->hdlc;
+                unregister_hdlc_device (hdlc);
+		free_hdlc_device (hdlc);
         }
 
         fst_disable_intr ( card );

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-12-02 22:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-12-02 22:02 [PATCH] (5/8) farsync - hdlc_device conversion Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).