aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wan/hd64572.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wan/hd64572.c')
-rw-r--r--drivers/net/wan/hd64572.c32
1 files changed, 15 insertions, 17 deletions
diff --git a/drivers/net/wan/hd64572.c b/drivers/net/wan/hd64572.c
index e332fe906aba..bdb625080a16 100644
--- a/drivers/net/wan/hd64572.c
+++ b/drivers/net/wan/hd64572.c
@@ -232,19 +232,12 @@ static inline void sca_msci_intr(port_t *port)
232{ 232{
233 u16 msci = get_msci(port); 233 u16 msci = get_msci(port);
234 card_t* card = port_to_card(port); 234 card_t* card = port_to_card(port);
235 u8 stat = sca_in(msci + ST1, card); /* read MSCI ST1 status */
236 235
237 /* Reset MSCI TX underrun and CDCD status bit */ 236 if (sca_in(msci + ST1, card) & ST1_CDCD) {
238 sca_out(stat & (ST1_UDRN | ST1_CDCD), msci + ST1, card); 237 /* Reset MSCI CDCD status bit */
239 238 sca_out(ST1_CDCD, msci + ST1, card);
240 if (stat & ST1_UDRN) {
241 /* TX Underrun error detected */
242 port_to_dev(port)->stats.tx_errors++;
243 port_to_dev(port)->stats.tx_fifo_errors++;
244 }
245
246 if (stat & ST1_CDCD)
247 sca_set_carrier(port); 239 sca_set_carrier(port);
240 }
248} 241}
249 242
250 243
@@ -351,11 +344,17 @@ static inline void sca_tx_done(port_t *port)
351 344
352 while (1) { 345 while (1) {
353 pkt_desc __iomem *desc = desc_address(port, port->txlast, 1); 346 pkt_desc __iomem *desc = desc_address(port, port->txlast, 1);
347 u8 stat = readb(&desc->stat);
354 348
355 if (!(readb(&desc->stat) & ST_TX_OWNRSHP)) 349 if (!(stat & ST_TX_OWNRSHP))
356 break; /* not yet transmitted */ 350 break; /* not yet transmitted */
357 dev->stats.tx_packets++; 351 if (stat & ST_TX_UNDRRUN) {
358 dev->stats.tx_bytes += readw(&desc->len); 352 dev->stats.tx_errors++;
353 dev->stats.tx_fifo_errors++;
354 } else {
355 dev->stats.tx_packets++;
356 dev->stats.tx_bytes += readw(&desc->len);
357 }
359 writeb(0, &desc->stat); /* Free descriptor */ 358 writeb(0, &desc->stat); /* Free descriptor */
360 port->txlast = next_desc(port, port->txlast, 1); 359 port->txlast = next_desc(port, port->txlast, 1);
361 } 360 }
@@ -503,12 +502,11 @@ static void sca_open(struct net_device *dev)
503 sca_out(0x3F, msci + TNR1, card); /* +1=TX DMA deactivation condition*/ 502 sca_out(0x3F, msci + TNR1, card); /* +1=TX DMA deactivation condition*/
504 503
505/* We're using the following interrupts: 504/* We're using the following interrupts:
506 - TXINT (DMAC completed all transmissions, underrun or DCD change) 505 - TXINT (DMAC completed all transmissions and DCD changes)
507 - all DMA interrupts 506 - all DMA interrupts
508*/ 507*/
509 /* MSCI TXINT and RXINTA interrupt enable */ 508 /* MSCI TXINT and RXINTA interrupt enable */
510 sca_outl(IE0_TXINT | IE0_RXINTA | IE0_UDRN | IE0_CDCD, msci + IE0, 509 sca_outl(IE0_TXINT | IE0_RXINTA | IE0_CDCD, msci + IE0, card);
511 card);
512 510
513 sca_out(port->tmc, msci + TMCR, card); 511 sca_out(port->tmc, msci + TMCR, card);
514 sca_out(port->tmc, msci + TMCT, card); 512 sca_out(port->tmc, msci + TMCT, card);