xircom_cb endianness fixes
* descriptors inside the rx and tx rings are l-e * don't cpu_to_le32() the argument of outl() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
460c54b779
commit
6f35d5d516
|
@ -83,8 +83,8 @@ static int bufferoffsets[NUMDESCRIPTORS] = {128,2048,4096,6144};
|
||||||
struct xircom_private {
|
struct xircom_private {
|
||||||
/* Send and receive buffers, kernel-addressable and dma addressable forms */
|
/* Send and receive buffers, kernel-addressable and dma addressable forms */
|
||||||
|
|
||||||
unsigned int *rx_buffer;
|
__le32 *rx_buffer;
|
||||||
unsigned int *tx_buffer;
|
__le32 *tx_buffer;
|
||||||
|
|
||||||
dma_addr_t rx_dma_handle;
|
dma_addr_t rx_dma_handle;
|
||||||
dma_addr_t tx_dma_handle;
|
dma_addr_t tx_dma_handle;
|
||||||
|
@ -412,19 +412,20 @@ static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
/* FIXME: The specification tells us that the length we send HAS to be a multiple of
|
/* FIXME: The specification tells us that the length we send HAS to be a multiple of
|
||||||
4 bytes. */
|
4 bytes. */
|
||||||
|
|
||||||
card->tx_buffer[4*desc+1] = skb->len;
|
card->tx_buffer[4*desc+1] = cpu_to_le32(skb->len);
|
||||||
if (desc == NUMDESCRIPTORS-1)
|
if (desc == NUMDESCRIPTORS - 1) /* bit 25: last descriptor of the ring */
|
||||||
card->tx_buffer[4*desc+1] |= (1<<25); /* bit 25: last descriptor of the ring */
|
card->tx_buffer[4*desc+1] |= cpu_to_le32(1<<25);
|
||||||
|
|
||||||
card->tx_buffer[4*desc+1] |= 0xF0000000;
|
card->tx_buffer[4*desc+1] |= cpu_to_le32(0xF0000000);
|
||||||
/* 0xF0... means want interrupts*/
|
/* 0xF0... means want interrupts*/
|
||||||
card->tx_skb[desc] = skb;
|
card->tx_skb[desc] = skb;
|
||||||
|
|
||||||
wmb();
|
wmb();
|
||||||
/* This gives the descriptor to the card */
|
/* This gives the descriptor to the card */
|
||||||
card->tx_buffer[4*desc] = 0x80000000;
|
card->tx_buffer[4*desc] = cpu_to_le32(0x80000000);
|
||||||
trigger_transmit(card);
|
trigger_transmit(card);
|
||||||
if (((int)card->tx_buffer[nextdescriptor*4])<0) { /* next descriptor is occupied... */
|
if (card->tx_buffer[nextdescriptor*4] & cpu_to_le32(0x8000000)) {
|
||||||
|
/* next descriptor is occupied... */
|
||||||
netif_stop_queue(dev);
|
netif_stop_queue(dev);
|
||||||
}
|
}
|
||||||
card->transmit_used = nextdescriptor;
|
card->transmit_used = nextdescriptor;
|
||||||
|
@ -590,8 +591,7 @@ descriptors and programs the addresses into the card.
|
||||||
*/
|
*/
|
||||||
static void setup_descriptors(struct xircom_private *card)
|
static void setup_descriptors(struct xircom_private *card)
|
||||||
{
|
{
|
||||||
unsigned int val;
|
u32 address;
|
||||||
unsigned int address;
|
|
||||||
int i;
|
int i;
|
||||||
enter("setup_descriptors");
|
enter("setup_descriptors");
|
||||||
|
|
||||||
|
@ -604,16 +604,16 @@ static void setup_descriptors(struct xircom_private *card)
|
||||||
for (i=0;i<NUMDESCRIPTORS;i++ ) {
|
for (i=0;i<NUMDESCRIPTORS;i++ ) {
|
||||||
|
|
||||||
/* Rx Descr0: It's empty, let the card own it, no errors -> 0x80000000 */
|
/* Rx Descr0: It's empty, let the card own it, no errors -> 0x80000000 */
|
||||||
card->rx_buffer[i*4 + 0] = 0x80000000;
|
card->rx_buffer[i*4 + 0] = cpu_to_le32(0x80000000);
|
||||||
/* Rx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
|
/* Rx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
|
||||||
card->rx_buffer[i*4 + 1] = 1536;
|
card->rx_buffer[i*4 + 1] = cpu_to_le32(1536);
|
||||||
if (i==NUMDESCRIPTORS-1)
|
if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
|
||||||
card->rx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */
|
card->rx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
|
||||||
|
|
||||||
/* Rx Descr2: address of the buffer
|
/* Rx Descr2: address of the buffer
|
||||||
we store the buffer at the 2nd half of the page */
|
we store the buffer at the 2nd half of the page */
|
||||||
|
|
||||||
address = (unsigned long) card->rx_dma_handle;
|
address = card->rx_dma_handle;
|
||||||
card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
|
card->rx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
|
||||||
/* Rx Desc3: address of 2nd buffer -> 0 */
|
/* Rx Desc3: address of 2nd buffer -> 0 */
|
||||||
card->rx_buffer[i*4 + 3] = 0;
|
card->rx_buffer[i*4 + 3] = 0;
|
||||||
|
@ -621,9 +621,8 @@ static void setup_descriptors(struct xircom_private *card)
|
||||||
|
|
||||||
wmb();
|
wmb();
|
||||||
/* Write the receive descriptor ring address to the card */
|
/* Write the receive descriptor ring address to the card */
|
||||||
address = (unsigned long) card->rx_dma_handle;
|
address = card->rx_dma_handle;
|
||||||
val = cpu_to_le32(address);
|
outl(address, card->io_port + CSR3); /* Receive descr list address */
|
||||||
outl(val, card->io_port + CSR3); /* Receive descr list address */
|
|
||||||
|
|
||||||
|
|
||||||
/* transmit descriptors */
|
/* transmit descriptors */
|
||||||
|
@ -633,13 +632,13 @@ static void setup_descriptors(struct xircom_private *card)
|
||||||
/* Tx Descr0: Empty, we own it, no errors -> 0x00000000 */
|
/* Tx Descr0: Empty, we own it, no errors -> 0x00000000 */
|
||||||
card->tx_buffer[i*4 + 0] = 0x00000000;
|
card->tx_buffer[i*4 + 0] = 0x00000000;
|
||||||
/* Tx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
|
/* Tx Descr1: buffer 1 is 1536 bytes, buffer 2 is 0 bytes */
|
||||||
card->tx_buffer[i*4 + 1] = 1536;
|
card->tx_buffer[i*4 + 1] = cpu_to_le32(1536);
|
||||||
if (i==NUMDESCRIPTORS-1)
|
if (i == NUMDESCRIPTORS - 1) /* bit 25 is "last descriptor" */
|
||||||
card->tx_buffer[i*4 + 1] |= (1 << 25); /* bit 25 is "last descriptor" */
|
card->tx_buffer[i*4 + 1] |= cpu_to_le32(1 << 25);
|
||||||
|
|
||||||
/* Tx Descr2: address of the buffer
|
/* Tx Descr2: address of the buffer
|
||||||
we store the buffer at the 2nd half of the page */
|
we store the buffer at the 2nd half of the page */
|
||||||
address = (unsigned long) card->tx_dma_handle;
|
address = card->tx_dma_handle;
|
||||||
card->tx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
|
card->tx_buffer[i*4 + 2] = cpu_to_le32(address + bufferoffsets[i]);
|
||||||
/* Tx Desc3: address of 2nd buffer -> 0 */
|
/* Tx Desc3: address of 2nd buffer -> 0 */
|
||||||
card->tx_buffer[i*4 + 3] = 0;
|
card->tx_buffer[i*4 + 3] = 0;
|
||||||
|
@ -647,9 +646,8 @@ static void setup_descriptors(struct xircom_private *card)
|
||||||
|
|
||||||
wmb();
|
wmb();
|
||||||
/* wite the transmit descriptor ring to the card */
|
/* wite the transmit descriptor ring to the card */
|
||||||
address = (unsigned long) card->tx_dma_handle;
|
address = card->tx_dma_handle;
|
||||||
val =cpu_to_le32(address);
|
outl(address, card->io_port + CSR4); /* xmit descr list address */
|
||||||
outl(val, card->io_port + CSR4); /* xmit descr list address */
|
|
||||||
|
|
||||||
leave("setup_descriptors");
|
leave("setup_descriptors");
|
||||||
}
|
}
|
||||||
|
@ -1180,7 +1178,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
enter("investigate_read_descriptor");
|
enter("investigate_read_descriptor");
|
||||||
status = card->rx_buffer[4*descnr];
|
status = le32_to_cpu(card->rx_buffer[4*descnr]);
|
||||||
|
|
||||||
if ((status > 0)) { /* packet received */
|
if ((status > 0)) { /* packet received */
|
||||||
|
|
||||||
|
@ -1210,7 +1208,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_pri
|
||||||
|
|
||||||
out:
|
out:
|
||||||
/* give the buffer back to the card */
|
/* give the buffer back to the card */
|
||||||
card->rx_buffer[4*descnr] = 0x80000000;
|
card->rx_buffer[4*descnr] = cpu_to_le32(0x80000000);
|
||||||
trigger_receive(card);
|
trigger_receive(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1226,7 +1224,7 @@ static void investigate_write_descriptor(struct net_device *dev, struct xircom_p
|
||||||
|
|
||||||
enter("investigate_write_descriptor");
|
enter("investigate_write_descriptor");
|
||||||
|
|
||||||
status = card->tx_buffer[4*descnr];
|
status = le32_to_cpu(card->tx_buffer[4*descnr]);
|
||||||
#if 0
|
#if 0
|
||||||
if (status & 0x8000) { /* Major error */
|
if (status & 0x8000) { /* Major error */
|
||||||
printk(KERN_ERR "Major transmit error status %x \n", status);
|
printk(KERN_ERR "Major transmit error status %x \n", status);
|
||||||
|
|
Loading…
Reference in New Issue