Commit 1a61fed9 authored by David S. Miller's avatar David S. Miller

Merge branch 'farsync-cleanups'

Peng Li says:

====================
net: farsync: clean up some code style issues

This patchset clean up some code style issues.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 5552571c f23a3da7
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
/* /* FarSync WAN driver for Linux (2.6.x kernel version)
* FarSync WAN driver for Linux (2.6.x kernel version)
* *
* Actually sync driver for X.21, V.35 and V.24 on FarSync T-series cards * Actually sync driver for X.21, V.35 and V.24 on FarSync T-series cards
* *
...@@ -30,8 +29,7 @@ ...@@ -30,8 +29,7 @@
#include "farsync.h" #include "farsync.h"
/* /* Module info
* Module info
*/ */
MODULE_AUTHOR("R.J.Dunlop <bob.dunlop@farsite.co.uk>"); MODULE_AUTHOR("R.J.Dunlop <bob.dunlop@farsite.co.uk>");
MODULE_DESCRIPTION("FarSync T-Series WAN driver. FarSite Communications Ltd."); MODULE_DESCRIPTION("FarSync T-Series WAN driver. FarSite Communications Ltd.");
...@@ -49,20 +47,23 @@ MODULE_LICENSE("GPL"); ...@@ -49,20 +47,23 @@ MODULE_LICENSE("GPL");
/* Default parameters for the link /* Default parameters for the link
*/ */
#define FST_TX_QUEUE_LEN 100 /* At 8Mbps a longer queue length is #define FST_TX_QUEUE_LEN 100 /* At 8Mbps a longer queue length is
* useful */ * useful
*/
#define FST_TXQ_DEPTH 16 /* This one is for the buffering #define FST_TXQ_DEPTH 16 /* This one is for the buffering
* of frames on the way down to the card * of frames on the way down to the card
* so that we can keep the card busy * so that we can keep the card busy
* and maximise throughput * and maximise throughput
*/ */
#define FST_HIGH_WATER_MARK 12 /* Point at which we flow control #define FST_HIGH_WATER_MARK 12 /* Point at which we flow control
* network layer */ * network layer
*/
#define FST_LOW_WATER_MARK 8 /* Point at which we remove flow #define FST_LOW_WATER_MARK 8 /* Point at which we remove flow
* control from network layer */ * control from network layer
*/
#define FST_MAX_MTU 8000 /* Huge but possible */ #define FST_MAX_MTU 8000 /* Huge but possible */
#define FST_DEF_MTU 1500 /* Common sane value */ #define FST_DEF_MTU 1500 /* Common sane value */
#define FST_TX_TIMEOUT (2*HZ) #define FST_TX_TIMEOUT (2 * HZ)
#ifdef ARPHRD_RAWHDLC #ifdef ARPHRD_RAWHDLC
#define ARPHRD_MYTYPE ARPHRD_RAWHDLC /* Raw frames */ #define ARPHRD_MYTYPE ARPHRD_RAWHDLC /* Raw frames */
...@@ -70,13 +71,12 @@ MODULE_LICENSE("GPL"); ...@@ -70,13 +71,12 @@ MODULE_LICENSE("GPL");
#define ARPHRD_MYTYPE ARPHRD_HDLC /* Cisco-HDLC (keepalives etc) */ #define ARPHRD_MYTYPE ARPHRD_HDLC /* Cisco-HDLC (keepalives etc) */
#endif #endif
/* /* Modules parameters and associated variables
* Modules parameters and associated variables
*/ */
static int fst_txq_low = FST_LOW_WATER_MARK; static int fst_txq_low = FST_LOW_WATER_MARK;
static int fst_txq_high = FST_HIGH_WATER_MARK; static int fst_txq_high = FST_HIGH_WATER_MARK;
static int fst_max_reads = 7; static int fst_max_reads = 7;
static int fst_excluded_cards = 0; static int fst_excluded_cards;
static int fst_excluded_list[FST_MAX_CARDS]; static int fst_excluded_list[FST_MAX_CARDS];
module_param(fst_txq_low, int, 0); module_param(fst_txq_low, int, 0);
...@@ -105,9 +105,11 @@ module_param_array(fst_excluded_list, int, NULL, 0); ...@@ -105,9 +105,11 @@ module_param_array(fst_excluded_list, int, NULL, 0);
#define FST_MEMSIZE 0x100000 /* Size of card memory (1Mb) */ #define FST_MEMSIZE 0x100000 /* Size of card memory (1Mb) */
#define SMC_BASE 0x00002000L /* Base offset of the shared memory window main #define SMC_BASE 0x00002000L /* Base offset of the shared memory window main
* configuration structure */ * configuration structure
*/
#define BFM_BASE 0x00010000L /* Base offset of the shared memory window DMA #define BFM_BASE 0x00010000L /* Base offset of the shared memory window DMA
* buffers */ * buffers
*/
#define LEN_TX_BUFFER 8192 /* Size of packet buffers */ #define LEN_TX_BUFFER 8192 /* Size of packet buffers */
#define LEN_RX_BUFFER 8192 #define LEN_RX_BUFFER 8192
...@@ -377,8 +379,7 @@ struct fst_shared { ...@@ -377,8 +379,7 @@ struct fst_shared {
#define INTCSR_9054 0x68 /* Interrupt control/status register */ #define INTCSR_9054 0x68 /* Interrupt control/status register */
/* 9054 DMA Registers */ /* 9054 DMA Registers */
/* /* Note that we will be using DMA Channel 0 for copying rx data
* Note that we will be using DMA Channel 0 for copying rx data
* and Channel 1 for copying tx data * and Channel 1 for copying tx data
*/ */
#define DMAMODE0 0x80 #define DMAMODE0 0x80
...@@ -421,7 +422,7 @@ struct buf_window { ...@@ -421,7 +422,7 @@ struct buf_window {
/* Per port (line or channel) information /* Per port (line or channel) information
*/ */
struct fst_port_info { struct fst_port_info {
struct net_device *dev; /* Device struct - must be first */ struct net_device *dev; /* Device struct - must be first */
struct fst_card_info *card; /* Card we're associated with */ struct fst_card_info *card; /* Card we're associated with */
int index; /* Port index on the card */ int index; /* Port index on the card */
int hwif; /* Line hardware (lineInterface copy) */ int hwif; /* Line hardware (lineInterface copy) */
...@@ -431,8 +432,7 @@ struct fst_port_info { ...@@ -431,8 +432,7 @@ struct fst_port_info {
int txpos; /* Next Tx buffer to use */ int txpos; /* Next Tx buffer to use */
int txipos; /* Next Tx buffer to check for free */ int txipos; /* Next Tx buffer to check for free */
int start; /* Indication of start/stop to network */ int start; /* Indication of start/stop to network */
/* /* A sixteen entry transmit queue
* A sixteen entry transmit queue
*/ */
int txqs; /* index to get next buffer to tx */ int txqs; /* index to get next buffer to tx */
int txqe; /* index to queue next packet */ int txqe; /* index to queue next packet */
...@@ -479,9 +479,7 @@ struct fst_card_info { ...@@ -479,9 +479,7 @@ struct fst_card_info {
#define dev_to_port(D) (dev_to_hdlc(D)->priv) #define dev_to_port(D) (dev_to_hdlc(D)->priv)
#define port_to_dev(P) ((P)->dev) #define port_to_dev(P) ((P)->dev)
/* Shared memory window access macros
/*
* Shared memory window access macros
* *
* We have a nice memory based structure above, which could be directly * We have a nice memory based structure above, which could be directly
* mapped on i386 but might not work on other architectures unless we use * mapped on i386 but might not work on other architectures unless we use
...@@ -491,16 +489,15 @@ struct fst_card_info { ...@@ -491,16 +489,15 @@ struct fst_card_info {
*/ */
#define WIN_OFFSET(X) ((long)&(((struct fst_shared *)SMC_BASE)->X)) #define WIN_OFFSET(X) ((long)&(((struct fst_shared *)SMC_BASE)->X))
#define FST_RDB(C,E) readb ((C)->mem + WIN_OFFSET(E)) #define FST_RDB(C, E) (readb((C)->mem + WIN_OFFSET(E)))
#define FST_RDW(C,E) readw ((C)->mem + WIN_OFFSET(E)) #define FST_RDW(C, E) (readw((C)->mem + WIN_OFFSET(E)))
#define FST_RDL(C,E) readl ((C)->mem + WIN_OFFSET(E)) #define FST_RDL(C, E) (readl((C)->mem + WIN_OFFSET(E)))
#define FST_WRB(C,E,B) writeb ((B), (C)->mem + WIN_OFFSET(E)) #define FST_WRB(C, E, B) (writeb((B), (C)->mem + WIN_OFFSET(E)))
#define FST_WRW(C,E,W) writew ((W), (C)->mem + WIN_OFFSET(E)) #define FST_WRW(C, E, W) (writew((W), (C)->mem + WIN_OFFSET(E)))
#define FST_WRL(C,E,L) writel ((L), (C)->mem + WIN_OFFSET(E)) #define FST_WRL(C, E, L) (writel((L), (C)->mem + WIN_OFFSET(E)))
/* /* Debug support
* Debug support
*/ */
#if FST_DEBUG #if FST_DEBUG
...@@ -524,43 +521,41 @@ do { \ ...@@ -524,43 +521,41 @@ do { \
} while (0) } while (0)
#endif #endif
/* /* PCI ID lookup table
* PCI ID lookup table
*/ */
static const struct pci_device_id fst_pci_dev_id[] = { static const struct pci_device_id fst_pci_dev_id[] = {
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T2P, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T2P, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_T2P}, PCI_ANY_ID, 0, 0, FST_TYPE_T2P},
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T4P, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T4P, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_T4P}, PCI_ANY_ID, 0, 0, FST_TYPE_T4P},
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T1U, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T1U, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_T1U}, PCI_ANY_ID, 0, 0, FST_TYPE_T1U},
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T2U, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T2U, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_T2U}, PCI_ANY_ID, 0, 0, FST_TYPE_T2U},
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T4U, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_T4U, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_T4U}, PCI_ANY_ID, 0, 0, FST_TYPE_T4U},
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_TE1, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_TE1, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_TE1}, PCI_ANY_ID, 0, 0, FST_TYPE_TE1},
{PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_TE1C, PCI_ANY_ID, {PCI_VENDOR_ID_FARSITE, PCI_DEVICE_ID_FARSITE_TE1C, PCI_ANY_ID,
PCI_ANY_ID, 0, 0, FST_TYPE_TE1}, PCI_ANY_ID, 0, 0, FST_TYPE_TE1},
{0,} /* End */ {0,} /* End */
}; };
MODULE_DEVICE_TABLE(pci, fst_pci_dev_id); MODULE_DEVICE_TABLE(pci, fst_pci_dev_id);
/* /* Device Driver Work Queues
* Device Driver Work Queues
* *
* So that we don't spend too much time processing events in the * So that we don't spend too much time processing events in the
* Interrupt Service routine, we will declare a work queue per Card * Interrupt Service routine, we will declare a work queue per Card
* and make the ISR schedule a task in the queue for later execution. * and make the ISR schedule a task in the queue for later execution.
* In the 2.4 Kernel we used to use the immediate queue for BH's * In the 2.4 Kernel we used to use the immediate queue for BH's
* Now that they are gone, tasklets seem to be much better than work * Now that they are gone, tasklets seem to be much better than work
* queues. * queues.
*/ */
...@@ -578,18 +573,16 @@ static u64 fst_work_txq; ...@@ -578,18 +573,16 @@ static u64 fst_work_txq;
static u64 fst_work_intq; static u64 fst_work_intq;
static void static void
fst_q_work_item(u64 * queue, int card_index) fst_q_work_item(u64 *queue, int card_index)
{ {
unsigned long flags; unsigned long flags;
u64 mask; u64 mask;
/* /* Grab the queue exclusively
* Grab the queue exclusively
*/ */
spin_lock_irqsave(&fst_work_q_lock, flags); spin_lock_irqsave(&fst_work_q_lock, flags);
/* /* Making an entry in the queue is simply a matter of setting
* Making an entry in the queue is simply a matter of setting
* a bit for the card indicating that there is work to do in the * a bit for the card indicating that there is work to do in the
* bottom half for the card. Note the limitation of 64 cards. * bottom half for the card. Note the limitation of 64 cards.
* That ought to be enough * That ought to be enough
...@@ -606,8 +599,7 @@ fst_process_tx_work_q(struct tasklet_struct *unused) ...@@ -606,8 +599,7 @@ fst_process_tx_work_q(struct tasklet_struct *unused)
u64 work_txq; u64 work_txq;
int i; int i;
/* /* Grab the queue exclusively
* Grab the queue exclusively
*/ */
dbg(DBG_TX, "fst_process_tx_work_q\n"); dbg(DBG_TX, "fst_process_tx_work_q\n");
spin_lock_irqsave(&fst_work_q_lock, flags); spin_lock_irqsave(&fst_work_q_lock, flags);
...@@ -615,12 +607,11 @@ fst_process_tx_work_q(struct tasklet_struct *unused) ...@@ -615,12 +607,11 @@ fst_process_tx_work_q(struct tasklet_struct *unused)
fst_work_txq = 0; fst_work_txq = 0;
spin_unlock_irqrestore(&fst_work_q_lock, flags); spin_unlock_irqrestore(&fst_work_q_lock, flags);
/* /* Call the bottom half for each card with work waiting
* Call the bottom half for each card with work waiting
*/ */
for (i = 0; i < FST_MAX_CARDS; i++) { for (i = 0; i < FST_MAX_CARDS; i++) {
if (work_txq & 0x01) { if (work_txq & 0x01) {
if (fst_card_array[i] != NULL) { if (fst_card_array[i]) {
dbg(DBG_TX, "Calling tx bh for card %d\n", i); dbg(DBG_TX, "Calling tx bh for card %d\n", i);
do_bottom_half_tx(fst_card_array[i]); do_bottom_half_tx(fst_card_array[i]);
} }
...@@ -636,8 +627,7 @@ fst_process_int_work_q(struct tasklet_struct *unused) ...@@ -636,8 +627,7 @@ fst_process_int_work_q(struct tasklet_struct *unused)
u64 work_intq; u64 work_intq;
int i; int i;
/* /* Grab the queue exclusively
* Grab the queue exclusively
*/ */
dbg(DBG_INTR, "fst_process_int_work_q\n"); dbg(DBG_INTR, "fst_process_int_work_q\n");
spin_lock_irqsave(&fst_work_q_lock, flags); spin_lock_irqsave(&fst_work_q_lock, flags);
...@@ -645,12 +635,11 @@ fst_process_int_work_q(struct tasklet_struct *unused) ...@@ -645,12 +635,11 @@ fst_process_int_work_q(struct tasklet_struct *unused)
fst_work_intq = 0; fst_work_intq = 0;
spin_unlock_irqrestore(&fst_work_q_lock, flags); spin_unlock_irqrestore(&fst_work_q_lock, flags);
/* /* Call the bottom half for each card with work waiting
* Call the bottom half for each card with work waiting
*/ */
for (i = 0; i < FST_MAX_CARDS; i++) { for (i = 0; i < FST_MAX_CARDS; i++) {
if (work_intq & 0x01) { if (work_intq & 0x01) {
if (fst_card_array[i] != NULL) { if (fst_card_array[i]) {
dbg(DBG_INTR, dbg(DBG_INTR,
"Calling rx & tx bh for card %d\n", i); "Calling rx & tx bh for card %d\n", i);
do_bottom_half_rx(fst_card_array[i]); do_bottom_half_rx(fst_card_array[i]);
...@@ -683,19 +672,16 @@ fst_cpureset(struct fst_card_info *card) ...@@ -683,19 +672,16 @@ fst_cpureset(struct fst_card_info *card)
dbg(DBG_ASS, dbg(DBG_ASS,
"Error in reading interrupt line register\n"); "Error in reading interrupt line register\n");
} }
/* /* Assert PLX software reset and Am186 hardware reset
* Assert PLX software reset and Am186 hardware reset
* and then deassert the PLX software reset but 186 still in reset * and then deassert the PLX software reset but 186 still in reset
*/ */
outw(0x440f, card->pci_conf + CNTRL_9054 + 2); outw(0x440f, card->pci_conf + CNTRL_9054 + 2);
outw(0x040f, card->pci_conf + CNTRL_9054 + 2); outw(0x040f, card->pci_conf + CNTRL_9054 + 2);
/* /* We are delaying here to allow the 9054 to reset itself
* We are delaying here to allow the 9054 to reset itself
*/ */
usleep_range(10, 20); usleep_range(10, 20);
outw(0x240f, card->pci_conf + CNTRL_9054 + 2); outw(0x240f, card->pci_conf + CNTRL_9054 + 2);
/* /* We are delaying here to allow the 9054 to reload its eeprom
* We are delaying here to allow the 9054 to reload its eeprom
*/ */
usleep_range(10, 20); usleep_range(10, 20);
outw(0x040f, card->pci_conf + CNTRL_9054 + 2); outw(0x040f, card->pci_conf + CNTRL_9054 + 2);
...@@ -720,19 +706,17 @@ static inline void ...@@ -720,19 +706,17 @@ static inline void
fst_cpurelease(struct fst_card_info *card) fst_cpurelease(struct fst_card_info *card)
{ {
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
/* /* Force posted writes to complete
* Force posted writes to complete
*/ */
(void) readb(card->mem); (void)readb(card->mem);
/* /* Release LRESET DO = 1
* Release LRESET DO = 1
* Then release Local Hold, DO = 1 * Then release Local Hold, DO = 1
*/ */
outw(0x040e, card->pci_conf + CNTRL_9054 + 2); outw(0x040e, card->pci_conf + CNTRL_9054 + 2);
outw(0x040f, card->pci_conf + CNTRL_9054 + 2); outw(0x040f, card->pci_conf + CNTRL_9054 + 2);
} else { } else {
(void) readb(card->ctlmem); (void)readb(card->ctlmem);
} }
} }
...@@ -742,7 +726,7 @@ static inline void ...@@ -742,7 +726,7 @@ static inline void
fst_clear_intr(struct fst_card_info *card) fst_clear_intr(struct fst_card_info *card)
{ {
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
(void) readb(card->ctlmem); (void)readb(card->ctlmem);
} else { } else {
/* Poke the appropriate PLX chip register (same as enabling interrupts) /* Poke the appropriate PLX chip register (same as enabling interrupts)
*/ */
...@@ -755,11 +739,10 @@ fst_clear_intr(struct fst_card_info *card) ...@@ -755,11 +739,10 @@ fst_clear_intr(struct fst_card_info *card)
static inline void static inline void
fst_enable_intr(struct fst_card_info *card) fst_enable_intr(struct fst_card_info *card)
{ {
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU)
outl(0x0f0c0900, card->pci_conf + INTCSR_9054); outl(0x0f0c0900, card->pci_conf + INTCSR_9054);
} else { else
outw(0x0543, card->pci_conf + INTCSR_9052); outw(0x0543, card->pci_conf + INTCSR_9052);
}
} }
/* Disable card interrupts /* Disable card interrupts
...@@ -767,11 +750,10 @@ fst_enable_intr(struct fst_card_info *card) ...@@ -767,11 +750,10 @@ fst_enable_intr(struct fst_card_info *card)
static inline void static inline void
fst_disable_intr(struct fst_card_info *card) fst_disable_intr(struct fst_card_info *card)
{ {
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU)
outl(0x00000000, card->pci_conf + INTCSR_9054); outl(0x00000000, card->pci_conf + INTCSR_9054);
} else { else
outw(0x0000, card->pci_conf + INTCSR_9052); outw(0x0000, card->pci_conf + INTCSR_9052);
}
} }
/* Process the result of trying to pass a received frame up the stack /* Process the result of trying to pass a received frame up the stack
...@@ -782,8 +764,7 @@ fst_process_rx_status(int rx_status, char *name) ...@@ -782,8 +764,7 @@ fst_process_rx_status(int rx_status, char *name)
switch (rx_status) { switch (rx_status) {
case NET_RX_SUCCESS: case NET_RX_SUCCESS:
{ {
/* /* Nothing to do here
* Nothing to do here
*/ */
break; break;
} }
...@@ -800,11 +781,10 @@ fst_process_rx_status(int rx_status, char *name) ...@@ -800,11 +781,10 @@ fst_process_rx_status(int rx_status, char *name)
static inline void static inline void
fst_init_dma(struct fst_card_info *card) fst_init_dma(struct fst_card_info *card)
{ {
/* /* This is only required for the PLX 9054
* This is only required for the PLX 9054
*/ */
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
pci_set_master(card->device); pci_set_master(card->device);
outl(0x00020441, card->pci_conf + DMAMODE0); outl(0x00020441, card->pci_conf + DMAMODE0);
outl(0x00020441, card->pci_conf + DMAMODE1); outl(0x00020441, card->pci_conf + DMAMODE1);
outl(0x0, card->pci_conf + DMATHR); outl(0x0, card->pci_conf + DMATHR);
...@@ -819,8 +799,7 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port, ...@@ -819,8 +799,7 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
{ {
struct net_device *dev = port_to_dev(port); struct net_device *dev = port_to_dev(port);
/* /* Everything is now set, just tell the card to go
* Everything is now set, just tell the card to go
*/ */
dbg(DBG_TX, "fst_tx_dma_complete\n"); dbg(DBG_TX, "fst_tx_dma_complete\n");
FST_WRB(card, txDescrRing[port->index][txpos].bits, FST_WRB(card, txDescrRing[port->index][txpos].bits,
...@@ -830,8 +809,7 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port, ...@@ -830,8 +809,7 @@ fst_tx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
netif_trans_update(dev); netif_trans_update(dev);
} }
/* /* Mark it for our own raw sockets interface
* Mark it for our own raw sockets interface
*/ */
static __be16 farsync_type_trans(struct sk_buff *skb, struct net_device *dev) static __be16 farsync_type_trans(struct sk_buff *skb, struct net_device *dev)
{ {
...@@ -874,55 +852,47 @@ fst_rx_dma_complete(struct fst_card_info *card, struct fst_port_info *port, ...@@ -874,55 +852,47 @@ fst_rx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,
dev->stats.rx_dropped++; dev->stats.rx_dropped++;
} }
/* /* Receive a frame through the DMA
* Receive a frame through the DMA
*/ */
static inline void static inline void
fst_rx_dma(struct fst_card_info *card, dma_addr_t dma, u32 mem, int len) fst_rx_dma(struct fst_card_info *card, dma_addr_t dma, u32 mem, int len)
{ {
/* /* This routine will setup the DMA and start it
* This routine will setup the DMA and start it
*/ */
dbg(DBG_RX, "In fst_rx_dma %x %x %d\n", (u32)dma, mem, len); dbg(DBG_RX, "In fst_rx_dma %x %x %d\n", (u32)dma, mem, len);
if (card->dmarx_in_progress) { if (card->dmarx_in_progress)
dbg(DBG_ASS, "In fst_rx_dma while dma in progress\n"); dbg(DBG_ASS, "In fst_rx_dma while dma in progress\n");
}
outl(dma, card->pci_conf + DMAPADR0); /* Copy to here */ outl(dma, card->pci_conf + DMAPADR0); /* Copy to here */
outl(mem, card->pci_conf + DMALADR0); /* from here */ outl(mem, card->pci_conf + DMALADR0); /* from here */
outl(len, card->pci_conf + DMASIZ0); /* for this length */ outl(len, card->pci_conf + DMASIZ0); /* for this length */
outl(0x00000000c, card->pci_conf + DMADPR0); /* In this direction */ outl(0x00000000c, card->pci_conf + DMADPR0); /* In this direction */
/* /* We use the dmarx_in_progress flag to flag the channel as busy
* We use the dmarx_in_progress flag to flag the channel as busy
*/ */
card->dmarx_in_progress = 1; card->dmarx_in_progress = 1;
outb(0x03, card->pci_conf + DMACSR0); /* Start the transfer */ outb(0x03, card->pci_conf + DMACSR0); /* Start the transfer */
} }
/* /* Send a frame through the DMA
* Send a frame through the DMA
*/ */
static inline void static inline void
fst_tx_dma(struct fst_card_info *card, dma_addr_t dma, u32 mem, int len) fst_tx_dma(struct fst_card_info *card, dma_addr_t dma, u32 mem, int len)
{ {
/* /* This routine will setup the DMA and start it.
* This routine will setup the DMA and start it.
*/ */
dbg(DBG_TX, "In fst_tx_dma %x %x %d\n", (u32)dma, mem, len); dbg(DBG_TX, "In fst_tx_dma %x %x %d\n", (u32)dma, mem, len);
if (card->dmatx_in_progress) { if (card->dmatx_in_progress)
dbg(DBG_ASS, "In fst_tx_dma while dma in progress\n"); dbg(DBG_ASS, "In fst_tx_dma while dma in progress\n");
}
outl(dma, card->pci_conf + DMAPADR1); /* Copy from here */ outl(dma, card->pci_conf + DMAPADR1); /* Copy from here */
outl(mem, card->pci_conf + DMALADR1); /* to here */ outl(mem, card->pci_conf + DMALADR1); /* to here */
outl(len, card->pci_conf + DMASIZ1); /* for this length */ outl(len, card->pci_conf + DMASIZ1); /* for this length */
outl(0x000000004, card->pci_conf + DMADPR1); /* In this direction */ outl(0x000000004, card->pci_conf + DMADPR1); /* In this direction */
/* /* We use the dmatx_in_progress to flag the channel as busy
* We use the dmatx_in_progress to flag the channel as busy
*/ */
card->dmatx_in_progress = 1; card->dmatx_in_progress = 1;
outb(0x03, card->pci_conf + DMACSR1); /* Start the transfer */ outb(0x03, card->pci_conf + DMACSR1); /* Start the transfer */
...@@ -958,12 +928,11 @@ fst_issue_cmd(struct fst_port_info *port, unsigned short cmd) ...@@ -958,12 +928,11 @@ fst_issue_cmd(struct fst_port_info *port, unsigned short cmd)
mbval = FST_RDW(card, portMailbox[port->index][0]); mbval = FST_RDW(card, portMailbox[port->index][0]);
} }
if (safety > 0) { if (safety > 0)
dbg(DBG_CMD, "Mailbox clear after %d jiffies\n", safety); dbg(DBG_CMD, "Mailbox clear after %d jiffies\n", safety);
}
if (mbval == NAK) { if (mbval == NAK)
dbg(DBG_CMD, "issue_cmd: previous command was NAK'd\n"); dbg(DBG_CMD, "issue_cmd: previous command was NAK'd\n");
}
FST_WRW(card, portMailbox[port->index][0], cmd); FST_WRW(card, portMailbox[port->index][0], cmd);
...@@ -998,8 +967,7 @@ fst_op_lower(struct fst_port_info *port, unsigned int outputs) ...@@ -998,8 +967,7 @@ fst_op_lower(struct fst_port_info *port, unsigned int outputs)
fst_issue_cmd(port, SETV24O); fst_issue_cmd(port, SETV24O);
} }
/* /* Setup port Rx buffers
* Setup port Rx buffers
*/ */
static void static void
fst_rx_config(struct fst_port_info *port) fst_rx_config(struct fst_port_info *port)
...@@ -1016,8 +984,8 @@ fst_rx_config(struct fst_port_info *port) ...@@ -1016,8 +984,8 @@ fst_rx_config(struct fst_port_info *port)
for (i = 0; i < NUM_RX_BUFFER; i++) { for (i = 0; i < NUM_RX_BUFFER; i++) {
offset = BUF_OFFSET(rxBuffer[pi][i][0]); offset = BUF_OFFSET(rxBuffer[pi][i][0]);
FST_WRW(card, rxDescrRing[pi][i].ladr, (u16) offset); FST_WRW(card, rxDescrRing[pi][i].ladr, (u16)offset);
FST_WRB(card, rxDescrRing[pi][i].hadr, (u8) (offset >> 16)); FST_WRB(card, rxDescrRing[pi][i].hadr, (u8)(offset >> 16));
FST_WRW(card, rxDescrRing[pi][i].bcnt, cnv_bcnt(LEN_RX_BUFFER)); FST_WRW(card, rxDescrRing[pi][i].bcnt, cnv_bcnt(LEN_RX_BUFFER));
FST_WRW(card, rxDescrRing[pi][i].mcnt, LEN_RX_BUFFER); FST_WRW(card, rxDescrRing[pi][i].mcnt, LEN_RX_BUFFER);
FST_WRB(card, rxDescrRing[pi][i].bits, DMA_OWN); FST_WRB(card, rxDescrRing[pi][i].bits, DMA_OWN);
...@@ -1026,8 +994,7 @@ fst_rx_config(struct fst_port_info *port) ...@@ -1026,8 +994,7 @@ fst_rx_config(struct fst_port_info *port)
spin_unlock_irqrestore(&card->card_lock, flags); spin_unlock_irqrestore(&card->card_lock, flags);
} }
/* /* Setup port Tx buffers
* Setup port Tx buffers
*/ */
static void static void
fst_tx_config(struct fst_port_info *port) fst_tx_config(struct fst_port_info *port)
...@@ -1044,8 +1011,8 @@ fst_tx_config(struct fst_port_info *port) ...@@ -1044,8 +1011,8 @@ fst_tx_config(struct fst_port_info *port)
for (i = 0; i < NUM_TX_BUFFER; i++) { for (i = 0; i < NUM_TX_BUFFER; i++) {
offset = BUF_OFFSET(txBuffer[pi][i][0]); offset = BUF_OFFSET(txBuffer[pi][i][0]);
FST_WRW(card, txDescrRing[pi][i].ladr, (u16) offset); FST_WRW(card, txDescrRing[pi][i].ladr, (u16)offset);
FST_WRB(card, txDescrRing[pi][i].hadr, (u8) (offset >> 16)); FST_WRB(card, txDescrRing[pi][i].hadr, (u8)(offset >> 16));
FST_WRW(card, txDescrRing[pi][i].bcnt, 0); FST_WRW(card, txDescrRing[pi][i].bcnt, 0);
FST_WRB(card, txDescrRing[pi][i].bits, 0); FST_WRB(card, txDescrRing[pi][i].bits, 0);
} }
...@@ -1069,16 +1036,14 @@ fst_intr_te1_alarm(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1069,16 +1036,14 @@ fst_intr_te1_alarm(struct fst_card_info *card, struct fst_port_info *port)
ais = FST_RDB(card, suStatus.alarmIndicationSignal); ais = FST_RDB(card, suStatus.alarmIndicationSignal);
if (los) { if (los) {
/* /* Lost the link
* Lost the link
*/ */
if (netif_carrier_ok(port_to_dev(port))) { if (netif_carrier_ok(port_to_dev(port))) {
dbg(DBG_INTR, "Net carrier off\n"); dbg(DBG_INTR, "Net carrier off\n");
netif_carrier_off(port_to_dev(port)); netif_carrier_off(port_to_dev(port));
} }
} else { } else {
/* /* Link available
* Link available
*/ */
if (!netif_carrier_ok(port_to_dev(port))) { if (!netif_carrier_ok(port_to_dev(port))) {
dbg(DBG_INTR, "Net carrier on\n"); dbg(DBG_INTR, "Net carrier on\n");
...@@ -1110,7 +1075,7 @@ fst_intr_ctlchg(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1110,7 +1075,7 @@ fst_intr_ctlchg(struct fst_card_info *card, struct fst_port_info *port)
signals = FST_RDL(card, v24DebouncedSts[port->index]); signals = FST_RDL(card, v24DebouncedSts[port->index]);
if (signals & (((port->hwif == X21) || (port->hwif == X21D)) if (signals & ((port->hwif == X21 || port->hwif == X21D)
? IPSTS_INDICATE : IPSTS_DCD)) { ? IPSTS_INDICATE : IPSTS_DCD)) {
if (!netif_carrier_ok(port_to_dev(port))) { if (!netif_carrier_ok(port_to_dev(port))) {
dbg(DBG_INTR, "DCD active\n"); dbg(DBG_INTR, "DCD active\n");
...@@ -1132,8 +1097,7 @@ fst_log_rx_error(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1132,8 +1097,7 @@ fst_log_rx_error(struct fst_card_info *card, struct fst_port_info *port,
{ {
struct net_device *dev = port_to_dev(port); struct net_device *dev = port_to_dev(port);
/* /* Increment the appropriate error counter
* Increment the appropriate error counter
*/ */
dev->stats.rx_errors++; dev->stats.rx_errors++;
if (dmabits & RX_OFLO) { if (dmabits & RX_OFLO) {
...@@ -1168,15 +1132,14 @@ fst_recover_rx_error(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1168,15 +1132,14 @@ fst_recover_rx_error(struct fst_card_info *card, struct fst_port_info *port,
int pi; int pi;
pi = port->index; pi = port->index;
/* /* Discard buffer descriptors until we see the start of the
* Discard buffer descriptors until we see the start of the
* next frame. Note that for long frames this could be in * next frame. Note that for long frames this could be in
* a subsequent interrupt. * a subsequent interrupt.
*/ */
i = 0; i = 0;
while ((dmabits & (DMA_OWN | RX_STP)) == 0) { while ((dmabits & (DMA_OWN | RX_STP)) == 0) {
FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
rxp = (rxp+1) % NUM_RX_BUFFER; rxp = (rxp + 1) % NUM_RX_BUFFER;
if (++i > NUM_RX_BUFFER) { if (++i > NUM_RX_BUFFER) {
dbg(DBG_ASS, "intr_rx: Discarding more bufs" dbg(DBG_ASS, "intr_rx: Discarding more bufs"
" than we have\n"); " than we have\n");
...@@ -1190,11 +1153,9 @@ fst_recover_rx_error(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1190,11 +1153,9 @@ fst_recover_rx_error(struct fst_card_info *card, struct fst_port_info *port,
/* Discard the terminal buffer */ /* Discard the terminal buffer */
if (!(dmabits & DMA_OWN)) { if (!(dmabits & DMA_OWN)) {
FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
rxp = (rxp+1) % NUM_RX_BUFFER; rxp = (rxp + 1) % NUM_RX_BUFFER;
} }
port->rxpos = rxp; port->rxpos = rxp;
return;
} }
/* Rx complete interrupt /* Rx complete interrupt
...@@ -1219,17 +1180,15 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1219,17 +1180,15 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
pi, rxp); pi, rxp);
return; return;
} }
if (card->dmarx_in_progress) { if (card->dmarx_in_progress)
return; return;
}
/* Get buffer length */ /* Get buffer length */
len = FST_RDW(card, rxDescrRing[pi][rxp].mcnt); len = FST_RDW(card, rxDescrRing[pi][rxp].mcnt);
/* Discard the CRC */ /* Discard the CRC */
len -= 2; len -= 2;
if (len == 0) { if (len == 0) {
/* /* This seems to happen on the TE1 interface sometimes
* This seems to happen on the TE1 interface sometimes
* so throw the frame away and log the event. * so throw the frame away and log the event.
*/ */
pr_err("Frame received with 0 length. Card %d Port %d\n", pr_err("Frame received with 0 length. Card %d Port %d\n",
...@@ -1237,7 +1196,7 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1237,7 +1196,7 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
/* Return descriptor to card */ /* Return descriptor to card */
FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
rxp = (rxp+1) % NUM_RX_BUFFER; rxp = (rxp + 1) % NUM_RX_BUFFER;
port->rxpos = rxp; port->rxpos = rxp;
return; return;
} }
...@@ -1254,7 +1213,8 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1254,7 +1213,8 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
} }
/* Allocate SKB */ /* Allocate SKB */
if ((skb = dev_alloc_skb(len)) == NULL) { skb = dev_alloc_skb(len);
if (!skb) {
dbg(DBG_RX, "intr_rx: can't allocate buffer\n"); dbg(DBG_RX, "intr_rx: can't allocate buffer\n");
dev->stats.rx_dropped++; dev->stats.rx_dropped++;
...@@ -1262,18 +1222,17 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1262,18 +1222,17 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
/* Return descriptor to card */ /* Return descriptor to card */
FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN); FST_WRB(card, rxDescrRing[pi][rxp].bits, DMA_OWN);
rxp = (rxp+1) % NUM_RX_BUFFER; rxp = (rxp + 1) % NUM_RX_BUFFER;
port->rxpos = rxp; port->rxpos = rxp;
return; return;
} }
/* /* We know the length we need to receive, len.
* We know the length we need to receive, len.
* It's not worth using the DMA for reads of less than * It's not worth using the DMA for reads of less than
* FST_MIN_DMA_LEN * FST_MIN_DMA_LEN
*/ */
if ((len < FST_MIN_DMA_LEN) || (card->family == FST_FAMILY_TXP)) { if (len < FST_MIN_DMA_LEN || card->family == FST_FAMILY_TXP) {
memcpy_fromio(skb_put(skb, len), memcpy_fromio(skb_put(skb, len),
card->mem + BUF_OFFSET(rxBuffer[pi][rxp][0]), card->mem + BUF_OFFSET(rxBuffer[pi][rxp][0]),
len); len);
...@@ -1307,12 +1266,11 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port) ...@@ -1307,12 +1266,11 @@ fst_intr_rx(struct fst_card_info *card, struct fst_port_info *port)
dbg(DBG_ASS, "About to increment rxpos by more than 1\n"); dbg(DBG_ASS, "About to increment rxpos by more than 1\n");
dbg(DBG_ASS, "rxp = %d rxpos = %d\n", rxp, port->rxpos); dbg(DBG_ASS, "rxp = %d rxpos = %d\n", rxp, port->rxpos);
} }
rxp = (rxp+1) % NUM_RX_BUFFER; rxp = (rxp + 1) % NUM_RX_BUFFER;
port->rxpos = rxp; port->rxpos = rxp;
} }
/* /* The bottom half to the ISR
* The bottom halfs to the ISR
* *
*/ */
...@@ -1326,8 +1284,7 @@ do_bottom_half_tx(struct fst_card_info *card) ...@@ -1326,8 +1284,7 @@ do_bottom_half_tx(struct fst_card_info *card)
unsigned long flags; unsigned long flags;
struct net_device *dev; struct net_device *dev;
/* /* Find a free buffer for the transmit
* Find a free buffer for the transmit
* Step through each port on this card * Step through each port on this card
*/ */
...@@ -1340,39 +1297,36 @@ do_bottom_half_tx(struct fst_card_info *card) ...@@ -1340,39 +1297,36 @@ do_bottom_half_tx(struct fst_card_info *card)
while (!(FST_RDB(card, txDescrRing[pi][port->txpos].bits) & while (!(FST_RDB(card, txDescrRing[pi][port->txpos].bits) &
DMA_OWN) && DMA_OWN) &&
!(card->dmatx_in_progress)) { !(card->dmatx_in_progress)) {
/* /* There doesn't seem to be a txdone event per-se
* There doesn't seem to be a txdone event per-se
* We seem to have to deduce it, by checking the DMA_OWN * We seem to have to deduce it, by checking the DMA_OWN
* bit on the next buffer we think we can use * bit on the next buffer we think we can use
*/ */
spin_lock_irqsave(&card->card_lock, flags); spin_lock_irqsave(&card->card_lock, flags);
if ((txq_length = port->txqe - port->txqs) < 0) { txq_length = port->txqe - port->txqs;
/* if (txq_length < 0) {
* This is the case where one has wrapped and the /* This is the case where one has wrapped and the
* maths gives us a negative number * maths gives us a negative number
*/ */
txq_length = txq_length + FST_TXQ_DEPTH; txq_length = txq_length + FST_TXQ_DEPTH;
} }
spin_unlock_irqrestore(&card->card_lock, flags); spin_unlock_irqrestore(&card->card_lock, flags);
if (txq_length > 0) { if (txq_length > 0) {
/* /* There is something to send
* There is something to send
*/ */
spin_lock_irqsave(&card->card_lock, flags); spin_lock_irqsave(&card->card_lock, flags);
skb = port->txq[port->txqs]; skb = port->txq[port->txqs];
port->txqs++; port->txqs++;
if (port->txqs == FST_TXQ_DEPTH) { if (port->txqs == FST_TXQ_DEPTH)
port->txqs = 0; port->txqs = 0;
}
spin_unlock_irqrestore(&card->card_lock, flags); spin_unlock_irqrestore(&card->card_lock, flags);
/* /* copy the data and set the required indicators on the
* copy the data and set the required indicators on the
* card. * card.
*/ */
FST_WRW(card, txDescrRing[pi][port->txpos].bcnt, FST_WRW(card, txDescrRing[pi][port->txpos].bcnt,
cnv_bcnt(skb->len)); cnv_bcnt(skb->len));
if ((skb->len < FST_MIN_DMA_LEN) || if (skb->len < FST_MIN_DMA_LEN ||
(card->family == FST_FAMILY_TXP)) { card->family == FST_FAMILY_TXP) {
/* Enqueue the packet with normal io */ /* Enqueue the packet with normal io */
memcpy_toio(card->mem + memcpy_toio(card->mem +
BUF_OFFSET(txBuffer[pi] BUF_OFFSET(txBuffer[pi]
...@@ -1401,8 +1355,7 @@ do_bottom_half_tx(struct fst_card_info *card) ...@@ -1401,8 +1355,7 @@ do_bottom_half_tx(struct fst_card_info *card)
} }
if (++port->txpos >= NUM_TX_BUFFER) if (++port->txpos >= NUM_TX_BUFFER)
port->txpos = 0; port->txpos = 0;
/* /* If we have flow control on, can we now release it?
* If we have flow control on, can we now release it?
*/ */
if (port->start) { if (port->start) {
if (txq_length < fst_txq_low) { if (txq_length < fst_txq_low) {
...@@ -1413,8 +1366,7 @@ do_bottom_half_tx(struct fst_card_info *card) ...@@ -1413,8 +1366,7 @@ do_bottom_half_tx(struct fst_card_info *card)
} }
dev_kfree_skb(skb); dev_kfree_skb(skb);
} else { } else {
/* /* Nothing to send so break out of the while loop
* Nothing to send so break out of the while loop
*/ */
break; break;
} }
...@@ -1438,8 +1390,7 @@ do_bottom_half_rx(struct fst_card_info *card) ...@@ -1438,8 +1390,7 @@ do_bottom_half_rx(struct fst_card_info *card)
while (!(FST_RDB(card, rxDescrRing[pi][port->rxpos].bits) while (!(FST_RDB(card, rxDescrRing[pi][port->rxpos].bits)
& DMA_OWN) && !(card->dmarx_in_progress)) { & DMA_OWN) && !(card->dmarx_in_progress)) {
if (rx_count > fst_max_reads) { if (rx_count > fst_max_reads) {
/* /* Don't spend forever in receive processing
* Don't spend forever in receive processing
* Schedule another event * Schedule another event
*/ */
fst_q_work_item(&fst_work_intq, card->card_no); fst_q_work_item(&fst_work_intq, card->card_no);
...@@ -1452,8 +1403,7 @@ do_bottom_half_rx(struct fst_card_info *card) ...@@ -1452,8 +1403,7 @@ do_bottom_half_rx(struct fst_card_info *card)
} }
} }
/* /* The interrupt service routine
* The interrupt service routine
* Dev_id is our fst_card_info pointer * Dev_id is our fst_card_info pointer
*/ */
static irqreturn_t static irqreturn_t
...@@ -1468,8 +1418,7 @@ fst_intr(int dummy, void *dev_id) ...@@ -1468,8 +1418,7 @@ fst_intr(int dummy, void *dev_id)
unsigned int do_card_interrupt; unsigned int do_card_interrupt;
unsigned int int_retry_count; unsigned int int_retry_count;
/* /* Check to see if the interrupt was for this card
* Check to see if the interrupt was for this card
* return if not * return if not
* Note that the call to clear the interrupt is important * Note that the call to clear the interrupt is important
*/ */
...@@ -1478,10 +1427,9 @@ fst_intr(int dummy, void *dev_id) ...@@ -1478,10 +1427,9 @@ fst_intr(int dummy, void *dev_id)
pr_err("Interrupt received for card %d in a non running state (%d)\n", pr_err("Interrupt received for card %d in a non running state (%d)\n",
card->card_no, card->state); card->card_no, card->state);
/* /* It is possible to really be running, i.e. we have re-loaded
* It is possible to really be running, i.e. we have re-loaded
* a running card * a running card
* Clear and reprime the interrupt source * Clear and reprime the interrupt source
*/ */
fst_clear_intr(card); fst_clear_intr(card);
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -1490,8 +1438,7 @@ fst_intr(int dummy, void *dev_id) ...@@ -1490,8 +1438,7 @@ fst_intr(int dummy, void *dev_id)
/* Clear and reprime the interrupt source */ /* Clear and reprime the interrupt source */
fst_clear_intr(card); fst_clear_intr(card);
/* /* Is the interrupt for this card (handshake == 1)
* Is the interrupt for this card (handshake == 1)
*/ */
do_card_interrupt = 0; do_card_interrupt = 0;
if (FST_RDB(card, interruptHandshake) == 1) { if (FST_RDB(card, interruptHandshake) == 1) {
...@@ -1500,13 +1447,11 @@ fst_intr(int dummy, void *dev_id) ...@@ -1500,13 +1447,11 @@ fst_intr(int dummy, void *dev_id)
FST_WRB(card, interruptHandshake, 0xEE); FST_WRB(card, interruptHandshake, 0xEE);
} }
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
/* /* Is it a DMA Interrupt
* Is it a DMA Interrupt
*/ */
dma_intcsr = inl(card->pci_conf + INTCSR_9054); dma_intcsr = inl(card->pci_conf + INTCSR_9054);
if (dma_intcsr & 0x00200000) { if (dma_intcsr & 0x00200000) {
/* /* DMA Channel 0 (Rx transfer complete)
* DMA Channel 0 (Rx transfer complete)
*/ */
dbg(DBG_RX, "DMA Rx xfer complete\n"); dbg(DBG_RX, "DMA Rx xfer complete\n");
outb(0x8, card->pci_conf + DMACSR0); outb(0x8, card->pci_conf + DMACSR0);
...@@ -1517,8 +1462,7 @@ fst_intr(int dummy, void *dev_id) ...@@ -1517,8 +1462,7 @@ fst_intr(int dummy, void *dev_id)
do_card_interrupt += FST_RX_DMA_INT; do_card_interrupt += FST_RX_DMA_INT;
} }
if (dma_intcsr & 0x00400000) { if (dma_intcsr & 0x00400000) {
/* /* DMA Channel 1 (Tx transfer complete)
* DMA Channel 1 (Tx transfer complete)
*/ */
dbg(DBG_TX, "DMA Tx xfer complete\n"); dbg(DBG_TX, "DMA Tx xfer complete\n");
outb(0x8, card->pci_conf + DMACSR1); outb(0x8, card->pci_conf + DMACSR1);
...@@ -1529,8 +1473,7 @@ fst_intr(int dummy, void *dev_id) ...@@ -1529,8 +1473,7 @@ fst_intr(int dummy, void *dev_id)
} }
} }
/* /* Have we been missing Interrupts
* Have we been missing Interrupts
*/ */
int_retry_count = FST_RDL(card, interruptRetryCount); int_retry_count = FST_RDL(card, interruptRetryCount);
if (int_retry_count) { if (int_retry_count) {
...@@ -1539,9 +1482,8 @@ fst_intr(int dummy, void *dev_id) ...@@ -1539,9 +1482,8 @@ fst_intr(int dummy, void *dev_id)
FST_WRL(card, interruptRetryCount, 0); FST_WRL(card, interruptRetryCount, 0);
} }
if (!do_card_interrupt) { if (!do_card_interrupt)
return IRQ_HANDLED; return IRQ_HANDLED;
}
/* Scehdule the bottom half of the ISR */ /* Scehdule the bottom half of the ISR */
fst_q_work_item(&fst_work_intq, card->card_no); fst_q_work_item(&fst_work_intq, card->card_no);
...@@ -1611,7 +1553,7 @@ fst_intr(int dummy, void *dev_id) ...@@ -1611,7 +1553,7 @@ fst_intr(int dummy, void *dev_id)
rdidx = 0; rdidx = 0;
} }
FST_WRB(card, interruptEvent.rdindex, rdidx); FST_WRB(card, interruptEvent.rdindex, rdidx);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
/* Check that the shared memory configuration is one that we can handle /* Check that the shared memory configuration is one that we can handle
...@@ -1635,7 +1577,8 @@ check_started_ok(struct fst_card_info *card) ...@@ -1635,7 +1577,8 @@ check_started_ok(struct fst_card_info *card)
return; return;
} }
/* Firmware status flag, 0x00 = initialising, 0x01 = OK, 0xFF = fail */ /* Firmware status flag, 0x00 = initialising, 0x01 = OK, 0xFF = fail */
if ((i = FST_RDB(card, taskStatus)) == 0x01) { i = FST_RDB(card, taskStatus);
if (i == 0x01) {
card->state = FST_RUNNING; card->state = FST_RUNNING;
} else if (i == 0xFF) { } else if (i == 0xFF) {
pr_err("Firmware initialisation failed. Card halted\n"); pr_err("Firmware initialisation failed. Card halted\n");
...@@ -1665,8 +1608,8 @@ set_conf_from_info(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1665,8 +1608,8 @@ set_conf_from_info(struct fst_card_info *card, struct fst_port_info *port,
int err; int err;
unsigned char my_framing; unsigned char my_framing;
/* Set things according to the user set valid flags /* Set things according to the user set valid flags
* Several of the old options have been invalidated/replaced by the * Several of the old options have been invalidated/replaced by the
* generic hdlc package. * generic hdlc package.
*/ */
err = 0; err = 0;
...@@ -1740,9 +1683,8 @@ set_conf_from_info(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1740,9 +1683,8 @@ set_conf_from_info(struct fst_card_info *card, struct fst_port_info *port,
#endif #endif
} }
#if FST_DEBUG #if FST_DEBUG
if (info->valid & FSTVAL_DEBUG) { if (info->valid & FSTVAL_DEBUG)
fst_debug_mask = info->debug; fst_debug_mask = info->debug;
}
#endif #endif
return err; return err;
...@@ -1754,7 +1696,7 @@ gather_conf_info(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1754,7 +1696,7 @@ gather_conf_info(struct fst_card_info *card, struct fst_port_info *port,
{ {
int i; int i;
memset(info, 0, sizeof (struct fstioc_info)); memset(info, 0, sizeof(struct fstioc_info));
i = port->index; i = port->index;
info->kernelVersion = LINUX_VERSION_CODE; info->kernelVersion = LINUX_VERSION_CODE;
...@@ -1787,27 +1729,23 @@ gather_conf_info(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1787,27 +1729,23 @@ gather_conf_info(struct fst_card_info *card, struct fst_port_info *port,
info->cardMode = FST_RDW(card, cardMode); info->cardMode = FST_RDW(card, cardMode);
info->smcFirmwareVersion = FST_RDL(card, smcFirmwareVersion); info->smcFirmwareVersion = FST_RDL(card, smcFirmwareVersion);
/* /* The T2U can report cable presence for both A or B
* The T2U can report cable presence for both A or B * in bits 0 and 1 of cableStatus. See which port we are and
* in bits 0 and 1 of cableStatus. See which port we are and
* do the mapping. * do the mapping.
*/ */
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
if (port->index == 0) { if (port->index == 0) {
/* /* Port A
* Port A
*/ */
info->cableStatus = info->cableStatus & 1; info->cableStatus = info->cableStatus & 1;
} else { } else {
/* /* Port B
* Port B
*/ */
info->cableStatus = info->cableStatus >> 1; info->cableStatus = info->cableStatus >> 1;
info->cableStatus = info->cableStatus & 1; info->cableStatus = info->cableStatus & 1;
} }
} }
/* /* Some additional bits if we are TE1
* Some additional bits if we are TE1
*/ */
if (card->type == FST_TYPE_TE1) { if (card->type == FST_TYPE_TE1) {
info->lineSpeed = FST_RDL(card, suConfig.dataRate); info->lineSpeed = FST_RDL(card, suConfig.dataRate);
...@@ -1851,14 +1789,12 @@ fst_set_iface(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1851,14 +1789,12 @@ fst_set_iface(struct fst_card_info *card, struct fst_port_info *port,
sync_serial_settings sync; sync_serial_settings sync;
int i; int i;
if (ifr->ifr_settings.size != sizeof (sync)) { if (ifr->ifr_settings.size != sizeof(sync))
return -ENOMEM; return -ENOMEM;
}
if (copy_from_user if (copy_from_user
(&sync, ifr->ifr_settings.ifs_ifsu.sync, sizeof (sync))) { (&sync, ifr->ifr_settings.ifs_ifsu.sync, sizeof(sync)))
return -EFAULT; return -EFAULT;
}
if (sync.loopback) if (sync.loopback)
return -EINVAL; return -EINVAL;
...@@ -1951,12 +1887,11 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1951,12 +1887,11 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port,
ifr->ifr_settings.type = IF_IFACE_X21; ifr->ifr_settings.type = IF_IFACE_X21;
break; break;
} }
if (ifr->ifr_settings.size == 0) { if (ifr->ifr_settings.size == 0)
return 0; /* only type requested */ return 0; /* only type requested */
}
if (ifr->ifr_settings.size < sizeof (sync)) { if (ifr->ifr_settings.size < sizeof(sync))
return -ENOMEM; return -ENOMEM;
}
i = port->index; i = port->index;
memset(&sync, 0, sizeof(sync)); memset(&sync, 0, sizeof(sync));
...@@ -1966,11 +1901,10 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port, ...@@ -1966,11 +1901,10 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port,
INTCLK ? CLOCK_INT : CLOCK_EXT; INTCLK ? CLOCK_INT : CLOCK_EXT;
sync.loopback = 0; sync.loopback = 0;
if (copy_to_user(ifr->ifr_settings.ifs_ifsu.sync, &sync, sizeof (sync))) { if (copy_to_user(ifr->ifr_settings.ifs_ifsu.sync, &sync, sizeof(sync)))
return -EFAULT; return -EFAULT;
}
ifr->ifr_settings.size = sizeof (sync); ifr->ifr_settings.size = sizeof(sync);
return 0; return 0;
} }
...@@ -2008,21 +1942,19 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -2008,21 +1942,19 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
/* First copy in the header with the length and offset of data /* First copy in the header with the length and offset of data
* to write * to write
*/ */
if (ifr->ifr_data == NULL) { if (!ifr->ifr_data)
return -EINVAL; return -EINVAL;
}
if (copy_from_user(&wrthdr, ifr->ifr_data, if (copy_from_user(&wrthdr, ifr->ifr_data,
sizeof (struct fstioc_write))) { sizeof(struct fstioc_write)))
return -EFAULT; return -EFAULT;
}
/* Sanity check the parameters. We don't support partial writes /* Sanity check the parameters. We don't support partial writes
* when going over the top * when going over the top
*/ */
if (wrthdr.size > FST_MEMSIZE || wrthdr.offset > FST_MEMSIZE || if (wrthdr.size > FST_MEMSIZE || wrthdr.offset > FST_MEMSIZE ||
wrthdr.size + wrthdr.offset > FST_MEMSIZE) { wrthdr.size + wrthdr.offset > FST_MEMSIZE)
return -ENXIO; return -ENXIO;
}
/* Now copy the data to the card. */ /* Now copy the data to the card. */
...@@ -2037,9 +1969,9 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -2037,9 +1969,9 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
/* Writes to the memory of a card in the reset state constitute /* Writes to the memory of a card in the reset state constitute
* a download * a download
*/ */
if (card->state == FST_RESET) { if (card->state == FST_RESET)
card->state = FST_DOWNLOAD; card->state = FST_DOWNLOAD;
}
return 0; return 0;
case FSTGETCONF: case FSTGETCONF:
...@@ -2059,21 +1991,18 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -2059,21 +1991,18 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
} }
} }
if (ifr->ifr_data == NULL) { if (!ifr->ifr_data)
return -EINVAL; return -EINVAL;
}
gather_conf_info(card, port, &info); gather_conf_info(card, port, &info);
if (copy_to_user(ifr->ifr_data, &info, sizeof (info))) { if (copy_to_user(ifr->ifr_data, &info, sizeof(info)))
return -EFAULT; return -EFAULT;
}
return 0; return 0;
case FSTSETCONF: case FSTSETCONF:
/* Most of the settings have been moved to the generic ioctls
/*
* Most of the settings have been moved to the generic ioctls
* this just covers debug and board ident now * this just covers debug and board ident now
*/ */
...@@ -2082,9 +2011,8 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -2082,9 +2011,8 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
card->card_no, card->state); card->card_no, card->state);
return -EIO; return -EIO;
} }
if (copy_from_user(&info, ifr->ifr_data, sizeof (info))) { if (copy_from_user(&info, ifr->ifr_data, sizeof(info)))
return -EFAULT; return -EFAULT;
}
return set_conf_from_info(card, port, &info); return set_conf_from_info(card, port, &info);
...@@ -2150,7 +2078,7 @@ fst_openport(struct fst_port_info *port) ...@@ -2150,7 +2078,7 @@ fst_openport(struct fst_port_info *port)
port->run = 1; port->run = 1;
signals = FST_RDL(port->card, v24DebouncedSts[port->index]); signals = FST_RDL(port->card, v24DebouncedSts[port->index]);
if (signals & (((port->hwif == X21) || (port->hwif == X21D)) if (signals & ((port->hwif == X21 || port->hwif == X21D)
? IPSTS_INDICATE : IPSTS_DCD)) ? IPSTS_INDICATE : IPSTS_DCD))
netif_carrier_on(port_to_dev(port)); netif_carrier_on(port_to_dev(port));
else else
...@@ -2159,7 +2087,6 @@ fst_openport(struct fst_port_info *port) ...@@ -2159,7 +2087,6 @@ fst_openport(struct fst_port_info *port)
port->txqe = 0; port->txqe = 0;
port->txqs = 0; port->txqs = 0;
} }
} }
static void static void
...@@ -2185,7 +2112,7 @@ fst_open(struct net_device *dev) ...@@ -2185,7 +2112,7 @@ fst_open(struct net_device *dev)
port = dev_to_port(dev); port = dev_to_port(dev);
if (!try_module_get(THIS_MODULE)) if (!try_module_get(THIS_MODULE))
return -EBUSY; return -EBUSY;
if (port->mode != FST_RAW) { if (port->mode != FST_RAW) {
err = hdlc_open(dev); err = hdlc_open(dev);
...@@ -2220,9 +2147,9 @@ fst_close(struct net_device *dev) ...@@ -2220,9 +2147,9 @@ fst_close(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
fst_closeport(dev_to_port(dev)); fst_closeport(dev_to_port(dev));
if (port->mode != FST_RAW) { if (port->mode != FST_RAW)
hdlc_close(dev); hdlc_close(dev);
}
module_put(THIS_MODULE); module_put(THIS_MODULE);
return 0; return 0;
} }
...@@ -2230,8 +2157,7 @@ fst_close(struct net_device *dev) ...@@ -2230,8 +2157,7 @@ fst_close(struct net_device *dev)
static int static int
fst_attach(struct net_device *dev, unsigned short encoding, unsigned short parity) fst_attach(struct net_device *dev, unsigned short encoding, unsigned short parity)
{ {
/* /* Setting currently fixed in FarSync card so we check and forget
* Setting currently fixed in FarSync card so we check and forget
*/ */
if (encoding != ENCODING_NRZ || parity != PARITY_CRC16_PR1_CCITT) if (encoding != ENCODING_NRZ || parity != PARITY_CRC16_PR1_CCITT)
return -EINVAL; return -EINVAL;
...@@ -2289,23 +2215,21 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2289,23 +2215,21 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
/* /* We are always going to queue the packet
* We are always going to queue the packet
* so that the bottom half is the only place we tx from * so that the bottom half is the only place we tx from
* Check there is room in the port txq * Check there is room in the port txq
*/ */
spin_lock_irqsave(&card->card_lock, flags); spin_lock_irqsave(&card->card_lock, flags);
if ((txq_length = port->txqe - port->txqs) < 0) { txq_length = port->txqe - port->txqs;
/* if (txq_length < 0) {
* This is the case where the next free has wrapped but the /* This is the case where the next free has wrapped but the
* last used hasn't * last used hasn't
*/ */
txq_length = txq_length + FST_TXQ_DEPTH; txq_length = txq_length + FST_TXQ_DEPTH;
} }
spin_unlock_irqrestore(&card->card_lock, flags); spin_unlock_irqrestore(&card->card_lock, flags);
if (txq_length > fst_txq_high) { if (txq_length > fst_txq_high) {
/* /* We have got enough buffers in the pipeline. Ask the network
* We have got enough buffers in the pipeline. Ask the network
* layer to stop sending frames down * layer to stop sending frames down
*/ */
netif_stop_queue(dev); netif_stop_queue(dev);
...@@ -2313,8 +2237,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2313,8 +2237,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
} }
if (txq_length == FST_TXQ_DEPTH - 1) { if (txq_length == FST_TXQ_DEPTH - 1) {
/* /* This shouldn't have happened but such is life
* This shouldn't have happened but such is life
*/ */
dev_kfree_skb(skb); dev_kfree_skb(skb);
dev->stats.tx_errors++; dev->stats.tx_errors++;
...@@ -2323,8 +2246,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2323,8 +2246,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
/* /* queue the buffer
* queue the buffer
*/ */
spin_lock_irqsave(&card->card_lock, flags); spin_lock_irqsave(&card->card_lock, flags);
port->txq[port->txqe] = skb; port->txq[port->txqe] = skb;
...@@ -2340,8 +2262,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2340,8 +2262,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
/* /* Card setup having checked hardware resources.
* Card setup having checked hardware resources.
* Should be pretty bizarre if we get an error here (kernel memory * Should be pretty bizarre if we get an error here (kernel memory
* exhaustion is one possibility). If we do see a problem we report it * exhaustion is one possibility). If we do see a problem we report it
* via a printk and leave the corresponding interface and all that follow * via a printk and leave the corresponding interface and all that follow
...@@ -2371,7 +2292,7 @@ fst_init_card(struct fst_card_info *card) ...@@ -2371,7 +2292,7 @@ fst_init_card(struct fst_card_info *card)
err = register_hdlc_device(card->ports[i].dev); err = register_hdlc_device(card->ports[i].dev);
if (err < 0) { if (err < 0) {
pr_err("Cannot register HDLC device for port %d (errno %d)\n", pr_err("Cannot register HDLC device for port %d (errno %d)\n",
i, -err); i, -err);
while (i--) while (i--)
unregister_hdlc_device(card->ports[i].dev); unregister_hdlc_device(card->ports[i].dev);
return err; return err;
...@@ -2393,14 +2314,13 @@ static const struct net_device_ops fst_ops = { ...@@ -2393,14 +2314,13 @@ static const struct net_device_ops fst_ops = {
.ndo_tx_timeout = fst_tx_timeout, .ndo_tx_timeout = fst_tx_timeout,
}; };
/* /* Initialise card when detected.
* Initialise card when detected.
* Returns 0 to indicate success, or errno otherwise. * Returns 0 to indicate success, or errno otherwise.
*/ */
static int static int
fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
static int no_of_cards_added = 0; static int no_of_cards_added;
struct fst_card_info *card; struct fst_card_info *card;
int err = 0; int err = 0;
int i; int i;
...@@ -2411,17 +2331,15 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2411,17 +2331,15 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
#if FST_DEBUG #if FST_DEBUG
dbg(DBG_ASS, "The value of debug mask is %x\n", fst_debug_mask); dbg(DBG_ASS, "The value of debug mask is %x\n", fst_debug_mask);
#endif #endif
/* /* We are going to be clever and allow certain cards not to be
* We are going to be clever and allow certain cards not to be
* configured. An exclude list can be provided in /etc/modules.conf * configured. An exclude list can be provided in /etc/modules.conf
*/ */
if (fst_excluded_cards != 0) { if (fst_excluded_cards != 0) {
/* /* There are cards to exclude
* There are cards to exclude
* *
*/ */
for (i = 0; i < fst_excluded_cards; i++) { for (i = 0; i < fst_excluded_cards; i++) {
if ((pdev->devfn) >> 3 == fst_excluded_list[i]) { if (pdev->devfn >> 3 == fst_excluded_list[i]) {
pr_info("FarSync PCI device %d not assigned\n", pr_info("FarSync PCI device %d not assigned\n",
(pdev->devfn) >> 3); (pdev->devfn) >> 3);
return -EBUSY; return -EBUSY;
...@@ -2431,16 +2349,18 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2431,16 +2349,18 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
/* Allocate driver private data */ /* Allocate driver private data */
card = kzalloc(sizeof(struct fst_card_info), GFP_KERNEL); card = kzalloc(sizeof(struct fst_card_info), GFP_KERNEL);
if (card == NULL) if (!card)
return -ENOMEM; return -ENOMEM;
/* Try to enable the device */ /* Try to enable the device */
if ((err = pci_enable_device(pdev)) != 0) { err = pci_enable_device(pdev);
if (err) {
pr_err("Failed to enable card. Err %d\n", -err); pr_err("Failed to enable card. Err %d\n", -err);
goto enable_fail; goto enable_fail;
} }
if ((err = pci_request_regions(pdev, "FarSync")) !=0) { err = pci_request_regions(pdev, "FarSync");
if (err) {
pr_err("Failed to allocate regions. Err %d\n", -err); pr_err("Failed to allocate regions. Err %d\n", -err);
goto regions_fail; goto regions_fail;
} }
...@@ -2449,12 +2369,14 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2449,12 +2369,14 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
card->pci_conf = pci_resource_start(pdev, 1); card->pci_conf = pci_resource_start(pdev, 1);
card->phys_mem = pci_resource_start(pdev, 2); card->phys_mem = pci_resource_start(pdev, 2);
card->phys_ctlmem = pci_resource_start(pdev, 3); card->phys_ctlmem = pci_resource_start(pdev, 3);
if ((card->mem = ioremap(card->phys_mem, FST_MEMSIZE)) == NULL) { card->mem = ioremap(card->phys_mem, FST_MEMSIZE);
if (!card->mem) {
pr_err("Physical memory remap failed\n"); pr_err("Physical memory remap failed\n");
err = -ENODEV; err = -ENODEV;
goto ioremap_physmem_fail; goto ioremap_physmem_fail;
} }
if ((card->ctlmem = ioremap(card->phys_ctlmem, 0x10)) == NULL) { card->ctlmem = ioremap(card->phys_ctlmem, 0x10);
if (!card->ctlmem) {
pr_err("Control memory remap failed\n"); pr_err("Control memory remap failed\n");
err = -ENODEV; err = -ENODEV;
goto ioremap_ctlmem_fail; goto ioremap_ctlmem_fail;
...@@ -2474,19 +2396,20 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2474,19 +2396,20 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
card->family = ((ent->driver_data == FST_TYPE_T2P) || card->family = ((ent->driver_data == FST_TYPE_T2P) ||
(ent->driver_data == FST_TYPE_T4P)) (ent->driver_data == FST_TYPE_T4P))
? FST_FAMILY_TXP : FST_FAMILY_TXU; ? FST_FAMILY_TXP : FST_FAMILY_TXU;
if ((ent->driver_data == FST_TYPE_T1U) || if (ent->driver_data == FST_TYPE_T1U ||
(ent->driver_data == FST_TYPE_TE1)) ent->driver_data == FST_TYPE_TE1)
card->nports = 1; card->nports = 1;
else else
card->nports = ((ent->driver_data == FST_TYPE_T2P) || card->nports = ((ent->driver_data == FST_TYPE_T2P) ||
(ent->driver_data == FST_TYPE_T2U)) ? 2 : 4; (ent->driver_data == FST_TYPE_T2U)) ? 2 : 4;
card->state = FST_UNINIT; card->state = FST_UNINIT;
spin_lock_init ( &card->card_lock ); spin_lock_init(&card->card_lock);
for ( i = 0 ; i < card->nports ; i++ ) { for (i = 0; i < card->nports; i++) {
struct net_device *dev = alloc_hdlcdev(&card->ports[i]); struct net_device *dev = alloc_hdlcdev(&card->ports[i]);
hdlc_device *hdlc; hdlc_device *hdlc;
if (!dev) { if (!dev) {
while (i--) while (i--)
free_netdev(card->ports[i].dev); free_netdev(card->ports[i].dev);
...@@ -2495,29 +2418,29 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2495,29 +2418,29 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
goto hdlcdev_fail; goto hdlcdev_fail;
} }
card->ports[i].dev = dev; card->ports[i].dev = dev;
card->ports[i].card = card; card->ports[i].card = card;
card->ports[i].index = i; card->ports[i].index = i;
card->ports[i].run = 0; card->ports[i].run = 0;
hdlc = dev_to_hdlc(dev); hdlc = dev_to_hdlc(dev);
/* Fill in the net device info */ /* Fill in the net device info */
/* Since this is a PCI setup this is purely /* Since this is a PCI setup this is purely
* informational. Give them the buffer addresses * informational. Give them the buffer addresses
* and basic card I/O. * and basic card I/O.
*/ */
dev->mem_start = card->phys_mem dev->mem_start = card->phys_mem
+ BUF_OFFSET ( txBuffer[i][0][0]); + BUF_OFFSET(txBuffer[i][0][0]);
dev->mem_end = card->phys_mem dev->mem_end = card->phys_mem
+ BUF_OFFSET ( txBuffer[i][NUM_TX_BUFFER - 1][LEN_RX_BUFFER - 1]); + BUF_OFFSET(txBuffer[i][NUM_TX_BUFFER - 1][LEN_RX_BUFFER - 1]);
dev->base_addr = card->pci_conf; dev->base_addr = card->pci_conf;
dev->irq = card->irq; dev->irq = card->irq;
dev->netdev_ops = &fst_ops; dev->netdev_ops = &fst_ops;
dev->tx_queue_len = FST_TX_QUEUE_LEN; dev->tx_queue_len = FST_TX_QUEUE_LEN;
dev->watchdog_timeo = FST_TX_TIMEOUT; dev->watchdog_timeo = FST_TX_TIMEOUT;
hdlc->attach = fst_attach; hdlc->attach = fst_attach;
hdlc->xmit = fst_start_xmit; hdlc->xmit = fst_start_xmit;
} }
card->device = pdev; card->device = pdev;
...@@ -2549,13 +2472,12 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2549,13 +2472,12 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (err) if (err)
goto init_card_fail; goto init_card_fail;
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
/* /* Allocate a dma buffer for transmit and receives
* Allocate a dma buffer for transmit and receives
*/ */
card->rx_dma_handle_host = card->rx_dma_handle_host =
dma_alloc_coherent(&card->device->dev, FST_MAX_MTU, dma_alloc_coherent(&card->device->dev, FST_MAX_MTU,
&card->rx_dma_handle_card, GFP_KERNEL); &card->rx_dma_handle_card, GFP_KERNEL);
if (card->rx_dma_handle_host == NULL) { if (!card->rx_dma_handle_host) {
pr_err("Could not allocate rx dma buffer\n"); pr_err("Could not allocate rx dma buffer\n");
err = -ENOMEM; err = -ENOMEM;
goto rx_dma_fail; goto rx_dma_fail;
...@@ -2563,7 +2485,7 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2563,7 +2485,7 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
card->tx_dma_handle_host = card->tx_dma_handle_host =
dma_alloc_coherent(&card->device->dev, FST_MAX_MTU, dma_alloc_coherent(&card->device->dev, FST_MAX_MTU,
&card->tx_dma_handle_card, GFP_KERNEL); &card->tx_dma_handle_card, GFP_KERNEL);
if (card->tx_dma_handle_host == NULL) { if (!card->tx_dma_handle_host) {
pr_err("Could not allocate tx dma buffer\n"); pr_err("Could not allocate tx dma buffer\n");
err = -ENOMEM; err = -ENOMEM;
goto tx_dma_fail; goto tx_dma_fail;
...@@ -2598,8 +2520,7 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -2598,8 +2520,7 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)
return err; return err;
} }
/* /* Cleanup and close down a card
* Cleanup and close down a card
*/ */
static void static void
fst_remove_one(struct pci_dev *pdev) fst_remove_one(struct pci_dev *pdev)
...@@ -2611,6 +2532,7 @@ fst_remove_one(struct pci_dev *pdev) ...@@ -2611,6 +2532,7 @@ fst_remove_one(struct pci_dev *pdev)
for (i = 0; i < card->nports; i++) { for (i = 0; i < card->nports; i++) {
struct net_device *dev = port_to_dev(&card->ports[i]); struct net_device *dev = port_to_dev(&card->ports[i]);
unregister_hdlc_device(dev); unregister_hdlc_device(dev);
} }
...@@ -2621,8 +2543,7 @@ fst_remove_one(struct pci_dev *pdev) ...@@ -2621,8 +2543,7 @@ fst_remove_one(struct pci_dev *pdev)
iounmap(card->mem); iounmap(card->mem);
pci_release_regions(pdev); pci_release_regions(pdev);
if (card->family == FST_FAMILY_TXU) { if (card->family == FST_FAMILY_TXU) {
/* /* Free dma buffers
* Free dma buffers
*/ */
dma_free_coherent(&card->device->dev, FST_MAX_MTU, dma_free_coherent(&card->device->dev, FST_MAX_MTU,
card->rx_dma_handle_host, card->rx_dma_handle_host,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment