aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ps3_gelic_net.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ps3_gelic_net.c')
-rw-r--r--drivers/net/ps3_gelic_net.c70
1 files changed, 39 insertions, 31 deletions
diff --git a/drivers/net/ps3_gelic_net.c b/drivers/net/ps3_gelic_net.c
index f6fb556a0f59..81e77d3d7804 100644
--- a/drivers/net/ps3_gelic_net.c
+++ b/drivers/net/ps3_gelic_net.c
@@ -98,7 +98,7 @@ gelic_net_get_descr_status(struct gelic_net_descr *descr)
98{ 98{
99 u32 cmd_status; 99 u32 cmd_status;
100 100
101 cmd_status = descr->dmac_cmd_status; 101 cmd_status = be32_to_cpu(descr->dmac_cmd_status);
102 cmd_status >>= GELIC_NET_DESCR_IND_PROC_SHIFT; 102 cmd_status >>= GELIC_NET_DESCR_IND_PROC_SHIFT;
103 return cmd_status; 103 return cmd_status;
104} 104}
@@ -117,13 +117,13 @@ static void gelic_net_set_descr_status(struct gelic_net_descr *descr,
117 u32 cmd_status; 117 u32 cmd_status;
118 118
119 /* read the status */ 119 /* read the status */
120 cmd_status = descr->dmac_cmd_status; 120 cmd_status = be32_to_cpu(descr->dmac_cmd_status);
121 /* clean the upper 4 bits */ 121 /* clean the upper 4 bits */
122 cmd_status &= GELIC_NET_DESCR_IND_PROC_MASKO; 122 cmd_status &= GELIC_NET_DESCR_IND_PROC_MASKO;
123 /* add the status to it */ 123 /* add the status to it */
124 cmd_status |= ((u32)status) << GELIC_NET_DESCR_IND_PROC_SHIFT; 124 cmd_status |= ((u32)status) << GELIC_NET_DESCR_IND_PROC_SHIFT;
125 /* and write it back */ 125 /* and write it back */
126 descr->dmac_cmd_status = cmd_status; 126 descr->dmac_cmd_status = cpu_to_be32(cmd_status);
127 /* 127 /*
128 * dma_cmd_status field is used to indicate whether the descriptor 128 * dma_cmd_status field is used to indicate whether the descriptor
129 * is valid or not. 129 * is valid or not.
@@ -193,7 +193,7 @@ static int gelic_net_init_chain(struct gelic_net_card *card,
193 /* chain bus addr of hw descriptor */ 193 /* chain bus addr of hw descriptor */
194 descr = start_descr; 194 descr = start_descr;
195 for (i = 0; i < no; i++, descr++) { 195 for (i = 0; i < no; i++, descr++) {
196 descr->next_descr_addr = descr->next->bus_addr; 196 descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr);
197 } 197 }
198 198
199 chain->head = start_descr; 199 chain->head = start_descr;
@@ -245,7 +245,7 @@ static int gelic_net_prepare_rx_descr(struct gelic_net_card *card,
245 "%s:allocate skb failed !!\n", __func__); 245 "%s:allocate skb failed !!\n", __func__);
246 return -ENOMEM; 246 return -ENOMEM;
247 } 247 }
248 descr->buf_size = bufsize; 248 descr->buf_size = cpu_to_be32(bufsize);
249 descr->dmac_cmd_status = 0; 249 descr->dmac_cmd_status = 0;
250 descr->result_size = 0; 250 descr->result_size = 0;
251 descr->valid_size = 0; 251 descr->valid_size = 0;
@@ -256,9 +256,10 @@ static int gelic_net_prepare_rx_descr(struct gelic_net_card *card,
256 if (offset) 256 if (offset)
257 skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset); 257 skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset);
258 /* io-mmu-map the skb */ 258 /* io-mmu-map the skb */
259 descr->buf_addr = dma_map_single(ctodev(card), descr->skb->data, 259 descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card),
260 GELIC_NET_MAX_MTU, 260 descr->skb->data,
261 DMA_FROM_DEVICE); 261 GELIC_NET_MAX_MTU,
262 DMA_FROM_DEVICE));
262 if (!descr->buf_addr) { 263 if (!descr->buf_addr) {
263 dev_kfree_skb_any(descr->skb); 264 dev_kfree_skb_any(descr->skb);
264 descr->skb = NULL; 265 descr->skb = NULL;
@@ -284,7 +285,7 @@ static void gelic_net_release_rx_chain(struct gelic_net_card *card)
284 do { 285 do {
285 if (descr->skb) { 286 if (descr->skb) {
286 dma_unmap_single(ctodev(card), 287 dma_unmap_single(ctodev(card),
287 descr->buf_addr, 288 be32_to_cpu(descr->buf_addr),
288 descr->skb->len, 289 descr->skb->len,
289 DMA_FROM_DEVICE); 290 DMA_FROM_DEVICE);
290 descr->buf_addr = 0; 291 descr->buf_addr = 0;
@@ -353,10 +354,11 @@ static void gelic_net_release_tx_descr(struct gelic_net_card *card,
353{ 354{
354 struct sk_buff *skb = descr->skb; 355 struct sk_buff *skb = descr->skb;
355 356
356 BUG_ON(!(descr->data_status & (1 << GELIC_NET_TXDESC_TAIL))); 357 BUG_ON(!(be32_to_cpu(descr->data_status) &
358 (1 << GELIC_NET_TXDESC_TAIL)));
357 359
358 dma_unmap_single(ctodev(card), descr->buf_addr, skb->len, 360 dma_unmap_single(ctodev(card),
359 DMA_TO_DEVICE); 361 be32_to_cpu(descr->buf_addr), skb->len, DMA_TO_DEVICE);
360 dev_kfree_skb_any(skb); 362 dev_kfree_skb_any(skb);
361 363
362 descr->buf_addr = 0; 364 descr->buf_addr = 0;
@@ -610,28 +612,29 @@ static void gelic_net_set_txdescr_cmdstat(struct gelic_net_descr *descr,
610 struct sk_buff *skb) 612 struct sk_buff *skb)
611{ 613{
612 if (skb->ip_summed != CHECKSUM_PARTIAL) 614 if (skb->ip_summed != CHECKSUM_PARTIAL)
613 descr->dmac_cmd_status = GELIC_NET_DMAC_CMDSTAT_NOCS | 615 descr->dmac_cmd_status =
614 GELIC_NET_DMAC_CMDSTAT_END_FRAME; 616 cpu_to_be32(GELIC_NET_DMAC_CMDSTAT_NOCS |
617 GELIC_NET_DMAC_CMDSTAT_END_FRAME);
615 else { 618 else {
616 /* is packet ip? 619 /* is packet ip?
617 * if yes: tcp? udp? */ 620 * if yes: tcp? udp? */
618 if (skb->protocol == htons(ETH_P_IP)) { 621 if (skb->protocol == htons(ETH_P_IP)) {
619 if (ip_hdr(skb)->protocol == IPPROTO_TCP) 622 if (ip_hdr(skb)->protocol == IPPROTO_TCP)
620 descr->dmac_cmd_status = 623 descr->dmac_cmd_status =
621 GELIC_NET_DMAC_CMDSTAT_TCPCS | 624 cpu_to_be32(GELIC_NET_DMAC_CMDSTAT_TCPCS |
622 GELIC_NET_DMAC_CMDSTAT_END_FRAME; 625 GELIC_NET_DMAC_CMDSTAT_END_FRAME);
623 626
624 else if (ip_hdr(skb)->protocol == IPPROTO_UDP) 627 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
625 descr->dmac_cmd_status = 628 descr->dmac_cmd_status =
626 GELIC_NET_DMAC_CMDSTAT_UDPCS | 629 cpu_to_be32(GELIC_NET_DMAC_CMDSTAT_UDPCS |
627 GELIC_NET_DMAC_CMDSTAT_END_FRAME; 630 GELIC_NET_DMAC_CMDSTAT_END_FRAME);
628 else /* 631 else /*
629 * the stack should checksum non-tcp and non-udp 632 * the stack should checksum non-tcp and non-udp
630 * packets on his own: NETIF_F_IP_CSUM 633 * packets on his own: NETIF_F_IP_CSUM
631 */ 634 */
632 descr->dmac_cmd_status = 635 descr->dmac_cmd_status =
633 GELIC_NET_DMAC_CMDSTAT_NOCS | 636 cpu_to_be32(GELIC_NET_DMAC_CMDSTAT_NOCS |
634 GELIC_NET_DMAC_CMDSTAT_END_FRAME; 637 GELIC_NET_DMAC_CMDSTAT_END_FRAME);
635 } 638 }
636 } 639 }
637} 640}
@@ -694,8 +697,8 @@ static int gelic_net_prepare_tx_descr_v(struct gelic_net_card *card,
694 return -ENOMEM; 697 return -ENOMEM;
695 } 698 }
696 699
697 descr->buf_addr = buf; 700 descr->buf_addr = cpu_to_be32(buf);
698 descr->buf_size = skb->len; 701 descr->buf_size = cpu_to_be32(skb->len);
699 descr->skb = skb; 702 descr->skb = skb;
700 descr->data_status = 0; 703 descr->data_status = 0;
701 descr->next_descr_addr = 0; /* terminate hw descr */ 704 descr->next_descr_addr = 0; /* terminate hw descr */
@@ -774,7 +777,7 @@ static int gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
774 * link this prepared descriptor to previous one 777 * link this prepared descriptor to previous one
775 * to achieve high performance 778 * to achieve high performance
776 */ 779 */
777 descr->prev->next_descr_addr = descr->bus_addr; 780 descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
778 /* 781 /*
779 * as hardware descriptor is modified in the above lines, 782 * as hardware descriptor is modified in the above lines,
780 * ensure that the hardware sees it 783 * ensure that the hardware sees it
@@ -814,19 +817,23 @@ static void gelic_net_pass_skb_up(struct gelic_net_descr *descr,
814 struct net_device *netdev; 817 struct net_device *netdev;
815 u32 data_status, data_error; 818 u32 data_status, data_error;
816 819
817 data_status = descr->data_status; 820 data_status = be32_to_cpu(descr->data_status);
818 data_error = descr->data_error; 821 data_error = be32_to_cpu(descr->data_error);
819 netdev = card->netdev; 822 netdev = card->netdev;
820 /* unmap skb buffer */ 823 /* unmap skb buffer */
821 skb = descr->skb; 824 skb = descr->skb;
822 dma_unmap_single(ctodev(card), descr->buf_addr, GELIC_NET_MAX_MTU, 825 dma_unmap_single(ctodev(card),
826 be32_to_cpu(descr->buf_addr), GELIC_NET_MAX_MTU,
823 DMA_FROM_DEVICE); 827 DMA_FROM_DEVICE);
824 828
825 skb_put(skb, descr->valid_size? descr->valid_size : descr->result_size); 829 skb_put(skb, descr->valid_size ?
830 be32_to_cpu(descr->valid_size) :
831 be32_to_cpu(descr->result_size));
826 if (!descr->valid_size) 832 if (!descr->valid_size)
827 dev_info(ctodev(card), "buffer full %x %x %x\n", 833 dev_info(ctodev(card), "buffer full %x %x %x\n",
828 descr->result_size, descr->buf_size, 834 be32_to_cpu(descr->result_size),
829 descr->dmac_cmd_status); 835 be32_to_cpu(descr->buf_size),
836 be32_to_cpu(descr->dmac_cmd_status));
830 837
831 descr->skb = NULL; 838 descr->skb = NULL;
832 /* 839 /*
@@ -873,7 +880,8 @@ static int gelic_net_decode_one_descr(struct gelic_net_card *card)
873 status = gelic_net_get_descr_status(descr); 880 status = gelic_net_get_descr_status(descr);
874 /* is this descriptor terminated with next_descr == NULL? */ 881 /* is this descriptor terminated with next_descr == NULL? */
875 dmac_chain_ended = 882 dmac_chain_ended =
876 descr->dmac_cmd_status & GELIC_NET_DMAC_CMDSTAT_RXDCEIS; 883 be32_to_cpu(descr->dmac_cmd_status) &
884 GELIC_NET_DMAC_CMDSTAT_RXDCEIS;
877 885
878 if (status == GELIC_NET_DESCR_CARDOWNED) 886 if (status == GELIC_NET_DESCR_CARDOWNED)
879 return 0; 887 return 0;
@@ -940,7 +948,7 @@ refill:
940 /* 948 /*
941 * Set this descriptor the end of the chain. 949 * Set this descriptor the end of the chain.
942 */ 950 */
943 descr->prev->next_descr_addr = descr->bus_addr; 951 descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
944 952
945 /* 953 /*
946 * If dmac chain was met, DMAC stopped. 954 * If dmac chain was met, DMAC stopped.