pasemi_mac: Fix register defines
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/4 pasemi_mac: Fix register defines
Some shift values were obviously wrong. Fix them to correspond with the masks.
drivers/net/pasemi_mac.h +2 -2
@@ -341,7 +341,7 @@ enum { PAS_IOB_DMA_TXCH_STAT_CNTDEL_M)#define PAS_IOB_DMA_RXCH_RESET (i) (0x1500 + (i)*4)#define PAS_IOB_DMA_RXCH_RESET_PCNT_M 0xffff0000 -#define PAS_IOB_DMA_RXCH_RESET_PCNT_S 0 +#define PAS_IOB_DMA_RXCH_RESET_PCNT_S 16#define PAS_IOB_DMA_RXCH_RESET_PCNT (x) (((x) << PAS_IOB_DMA_RXCH_RESET_PCNT_S) & \ PAS_IOB_DMA_RXCH_RESET_PCNT_M)#define PAS_IOB_DMA_RXCH_RESET_PCNTRST 0x00000020
@@ -352,7 +352,7 @@ enum {#define PAS_IOB_DMA_RXCH_RESET_PINTC 0x00000001#define PAS_IOB_DMA_TXCH_RESET (i) (0x1600 + (i)*4)#define PAS_IOB_DMA_TXCH_RESET_PCNT_M 0xffff0000 -#define PAS_IOB_DMA_TXCH_RESET_PCNT_S 0 +#define PAS_IOB_DMA_TXCH_RESET_PCNT_S 16#define PAS_IOB_DMA_TXCH_RESET_PCNT (x) (((x) << PAS_IOB_DMA_TXCH_RESET_PCNT_S) & \ PAS_IOB_DMA_TXCH_RESET_PCNT_M)#define PAS_IOB_DMA_TXCH_RESET_PCNTRST 0x00000020
--
Quoted 4 lines · [email protected] wrote:
Some shift values were obviously wrong. Fix them to correspond with the masks.
Signed-off-by Olof Johansson <[email protected]>
applied 1-4 to #upstream-fixes
PATCH 2/4 pasemi_mac: Interrupt ack fixes
In reply to a message not in the archiveFix the packet count resets at interrupt time, using the cacheable packet count status to set number of processed/received packets.
The ack count is the cumulative number of packets processed, and not incremental.
drivers/net/pasemi_mac.c +13 -14
@@ -384,17 +384,14 @@ static void pasemi_mac_replenish_rx_ringstatic void pasemi_mac_restart_rx_intr (struct pasemi_mac *mac) { -unsigned int reg, stat; +unsigned int reg, pcnt;/* Re-enable packet count interrupts: finally * ack the packet count interrupt we got in rx_intr. */ -pci_read_config_dword (mac->iob_pdev, -PAS_IOB_DMA_RXCH_STAT (mac->dma_rxch), - &stat); + pcnt = *mac->rx_status &PAS_STATUS_PCNT_M ; - reg =PAS_IOB_DMA_RXCH_RESET_PCNT (stat &PAS_IOB_DMA_RXCH_STAT_CNTDEL_M ) - |PAS_IOB_DMA_RXCH_RESET_PINTC ; + reg =PAS_IOB_DMA_RXCH_RESET_PCNT (pcnt) |PAS_IOB_DMA_RXCH_RESET_PINTC ; pci_write_config_dword(mac->iob_pdev, PAS_IOB_DMA_RXCH_RESET(mac->dma_rxch),
@@ -403,14 +400,12 @@ static void pasemi_mac_restart_rx_intr(sstatic void pasemi_mac_restart_tx_intr (struct pasemi_mac *mac) { -unsigned int reg, stat; +unsigned int reg, pcnt;/* Re-enable packet count interrupts */ -pci_read_config_dword (mac->iob_pdev, -PAS_IOB_DMA_TXCH_STAT (mac->dma_txch), &stat); + pcnt = *mac->rx_status &PAS_STATUS_PCNT_M ; - reg =PAS_IOB_DMA_TXCH_RESET_PCNT (stat &PAS_IOB_DMA_TXCH_STAT_CNTDEL_M ) - |PAS_IOB_DMA_TXCH_RESET_PINTC ; + reg =PAS_IOB_DMA_TXCH_RESET_PCNT (pcnt) |PAS_IOB_DMA_TXCH_RESET_PINTC ;pci_write_config_dword (mac->iob_pdev,PAS_IOB_DMA_TXCH_RESET (mac->dma_txch), reg);
@@ -591,21 +588,24 @@ static irqreturn_t pasemi_mac_tx_intr(in {struct net_device *dev = data;struct pasemi_mac *mac =netdev_priv (dev); -unsigned int reg; +unsigned int reg, pcnt;if (!(*mac->tx_status &PAS_STATUS_CAUSE_M ))return IRQ_NONE ;pasemi_mac_clean_tx (mac); - reg =PAS_IOB_DMA_TXCH_RESET_PINTC ; + pcnt = *mac->tx_status &PAS_STATUS_PCNT_M ; + + reg =PAS_IOB_DMA_TXCH_RESET_PCNT (pcnt) |PAS_IOB_DMA_TXCH_RESET_PINTC ;if (*mac->tx_status &PAS_STATUS_SOFT ) reg |=PAS_IOB_DMA_TXCH_RESET_SINTC ;if (*mac->tx_status &PAS_STATUS_ERROR ) reg |=PAS_IOB_DMA_TXCH_RESET_DINTC ; -pci_write_config_dword (mac->iob_pdev,PAS_IOB_DMA_TXCH_RESET (mac->dma_txch), +pci_write_config_dword (mac->iob_pdev, +PAS_IOB_DMA_TXCH_RESET (mac->dma_txch), reg);return IRQ_HANDLED ;
@@ -974,6 +974,7 @@ static int pasemi_mac_start_tx(struct skif (txring->next_to_clean - txring->next_to_use ==TX_RING_SIZE ) {spin_unlock_irqrestore (&txring->lock, flags);pasemi_mac_clean_tx (mac); +pasemi_mac_restart_tx_intr (mac);spin_lock_irqsave (&txring->lock, flags); if (txring->next_to_clean - txring->next_to_use ==
--
PATCH v2 2/4 pasemi_mac: Interrupt ack fixes
Interrupt ack fixes
Fix the packet count resets at interrupt time, using the cacheable packet count status to set number of processed/received packets, since the ack count is the cumulative number of packets processed, and not incremental.
---
Quoted 1 line · On Sat, May 12, 2007 at 02:57:32PM -0500, [email protected] wrote:
static void
pasemi_mac_restart_tx_intr(struct pasemi_mac *mac)
[..]
Review
Quoted 1 line
(quoted diff) +1
-0+ pcnt = *mac->rx_status & PAS_STATUS_PCNT_M;
^^
Stupid copy-and-paste error. Fixed.
drivers/net/pasemi_mac.c +13 -14
@@ -384,17 +384,14 @@ static void pasemi_mac_replenish_rx_ringstatic void pasemi_mac_restart_rx_intr (struct pasemi_mac *mac) { -unsigned int reg, stat; +unsigned int reg, pcnt;/* Re-enable packet count interrupts: finally * ack the packet count interrupt we got in rx_intr. */ -pci_read_config_dword (mac->iob_pdev, -PAS_IOB_DMA_RXCH_STAT (mac->dma_rxch), - &stat); + pcnt = *mac->rx_status &PAS_STATUS_PCNT_M ; - reg =PAS_IOB_DMA_RXCH_RESET_PCNT (stat &PAS_IOB_DMA_RXCH_STAT_CNTDEL_M ) - |PAS_IOB_DMA_RXCH_RESET_PINTC ; + reg =PAS_IOB_DMA_RXCH_RESET_PCNT (pcnt) |PAS_IOB_DMA_RXCH_RESET_PINTC ; pci_write_config_dword(mac->iob_pdev, PAS_IOB_DMA_RXCH_RESET(mac->dma_rxch),
@@ -403,14 +400,12 @@ static void pasemi_mac_restart_rx_intr(sstatic void pasemi_mac_restart_tx_intr (struct pasemi_mac *mac) { -unsigned int reg, stat; +unsigned int reg, pcnt;/* Re-enable packet count interrupts */ -pci_read_config_dword (mac->iob_pdev, -PAS_IOB_DMA_TXCH_STAT (mac->dma_txch), &stat); + pcnt = *mac->tx_status &PAS_STATUS_PCNT_M ; - reg =PAS_IOB_DMA_TXCH_RESET_PCNT (stat &PAS_IOB_DMA_TXCH_STAT_CNTDEL_M ) - |PAS_IOB_DMA_TXCH_RESET_PINTC ; + reg =PAS_IOB_DMA_TXCH_RESET_PCNT (pcnt) |PAS_IOB_DMA_TXCH_RESET_PINTC ;pci_write_config_dword (mac->iob_pdev,PAS_IOB_DMA_TXCH_RESET (mac->dma_txch), reg);
@@ -591,21 +588,24 @@ static irqreturn_t pasemi_mac_tx_intr(in {struct net_device *dev = data;struct pasemi_mac *mac =netdev_priv (dev); -unsigned int reg; +unsigned int reg, pcnt;if (!(*mac->tx_status &PAS_STATUS_CAUSE_M ))return IRQ_NONE ;pasemi_mac_clean_tx (mac); - reg =PAS_IOB_DMA_TXCH_RESET_PINTC ; + pcnt = *mac->tx_status &PAS_STATUS_PCNT_M ; + + reg =PAS_IOB_DMA_TXCH_RESET_PCNT (pcnt) |PAS_IOB_DMA_TXCH_RESET_PINTC ;if (*mac->tx_status &PAS_STATUS_SOFT ) reg |=PAS_IOB_DMA_TXCH_RESET_SINTC ;if (*mac->tx_status &PAS_STATUS_ERROR ) reg |=PAS_IOB_DMA_TXCH_RESET_DINTC ; -pci_write_config_dword (mac->iob_pdev,PAS_IOB_DMA_TXCH_RESET (mac->dma_txch), +pci_write_config_dword (mac->iob_pdev, +PAS_IOB_DMA_TXCH_RESET (mac->dma_txch), reg);return IRQ_HANDLED ;
@@ -974,6 +974,7 @@ static int pasemi_mac_start_tx(struct skif (txring->next_to_clean - txring->next_to_use ==TX_RING_SIZE ) {spin_unlock_irqrestore (&txring->lock, flags);pasemi_mac_clean_tx (mac); +pasemi_mac_restart_tx_intr (mac);spin_lock_irqsave (&txring->lock, flags); if (txring->next_to_clean - txring->next_to_use ==
PATCH 3/4 pasemi_mac: Terminate PCI ID list
In reply to a message not in the archiveThis caused some very interesting behaviour depending on what happened to be built at the same time. Add terminating empty entry to the list of IDs.
drivers/net/pasemi_mac.c +1 -0
@@ -1211,6 +1211,7 @@ static void __devexit pasemi_mac_remove(static struct pci_device_id pasemi_mac_pci_tbl[] = { {PCI_DEVICE (PCI_VENDOR_ID_PASEMI ,0xa005 ) }, {PCI_DEVICE (PCI_VENDOR_ID_PASEMI ,0xa006 ) }, + { }, };MODULE_DEVICE_TABLE (pci, pasemi_mac_pci_tbl);
--
PATCH 4/4 pasemi_mac: Fix local-mac-address parsing
In reply to a message not in the archiveTurns out we have an old version of firmware that stores the mac address in 'mac-address' as a string instead of a byte array. All versions that use local-mac-address should have it as byte array, so no need to do string parsing for that case.
drivers/net/pasemi_mac.c +14 -3
@@ -85,6 +85,7 @@ static int pasemi_get_mac_addr(struct pa {struct pci_dev *pdev = mac->pdev;struct device_node *dn =pci_device_to_OF_node (pdev); +int len;const u8 *maddr;u8 addr[6 ];
@@ -94,9 +95,17 @@ static int pasemi_get_mac_addr(struct pareturn -ENOENT ; } - maddr =of_get_property (dn,"local-mac-address" ,NULL ); + maddr =of_get_property (dn,"local-mac-address" , &len); + +if (maddr && len ==6 ) { +memcpy (mac->mac_addr, maddr,6 ); +return 0 ; + } + +/* Some old versions of firmware mistakenly uses mac-address +* (and as a string) instead of a byte array in local-mac-address. +*/ -/* Fall back to mac-address for older firmware */ if (maddr ==NULL ) maddr =of_get_property (dn,"mac-address" ,NULL );
@@ -106,6 +115,7 @@ static int pasemi_get_mac_addr(struct pareturn -ENOENT ; } +if (sscanf (maddr,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx" , &addr[0 ], &addr[1 ], &addr[2 ], &addr[3 ], &addr[4 ], &addr[5 ]) !=6 ) { dev_warn(&pdev->dev,
@@ -113,7 +123,8 @@ static int pasemi_get_mac_addr(struct pareturn -EINVAL ; } -memcpy (mac->mac_addr, addr,sizeof (addr)); +memcpy (mac->mac_addr, addr,6 ); +return 0 ; }
--