Skip to content

Commit 3ce4f9c

Browse files
glevanddavem330
authored andcommitted
net/ps3_gelic_net: Add gelic_descr structures
In an effort to make the PS3 gelic driver easier to maintain, create two new structures, struct gelic_hw_regs and struct gelic_chain_link, and replace the corresponding members of struct gelic_descr with the new structures. The new struct gelic_hw_regs holds the register variables used by the gelic hardware device. The new struct gelic_chain_link holds variables used to manage the driver's linked list of gelic descr structures. Signed-off-by: Geoff Levand <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fb9bb70 commit 3ce4f9c

File tree

2 files changed

+109
-92
lines changed

2 files changed

+109
-92
lines changed

drivers/net/ethernet/toshiba/ps3_gelic_net.c

Lines changed: 94 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,13 @@ static void gelic_card_get_ether_port_status(struct gelic_card *card,
9393
* gelic_descr_get_status -- returns the status of a descriptor
9494
* @descr: descriptor to look at
9595
*
96-
* returns the status as in the dmac_cmd_status field of the descriptor
96+
* returns the status as in the hw_regs.dmac_cmd_status field of the descriptor
9797
*/
9898
static enum gelic_descr_dma_status
9999
gelic_descr_get_status(struct gelic_descr *descr)
100100
{
101-
return be32_to_cpu(descr->dmac_cmd_status) & GELIC_DESCR_DMA_STAT_MASK;
101+
return be32_to_cpu(descr->hw_regs.dmac_cmd_status) &
102+
GELIC_DESCR_DMA_STAT_MASK;
102103
}
103104

104105
static int gelic_card_set_link_mode(struct gelic_card *card, int mode)
@@ -152,15 +153,15 @@ static void gelic_card_enable_rxdmac(struct gelic_card *card)
152153
if (gelic_descr_get_status(card->rx_chain.head) !=
153154
GELIC_DESCR_DMA_CARDOWNED) {
154155
printk(KERN_ERR "%s: status=%x\n", __func__,
155-
be32_to_cpu(card->rx_chain.head->dmac_cmd_status));
156+
be32_to_cpu(card->rx_chain.head->hw_regs.dmac_cmd_status));
156157
printk(KERN_ERR "%s: nextphy=%x\n", __func__,
157-
be32_to_cpu(card->rx_chain.head->next_descr_addr));
158+
be32_to_cpu(card->rx_chain.head->hw_regs.next_descr_addr));
158159
printk(KERN_ERR "%s: head=%p\n", __func__,
159160
card->rx_chain.head);
160161
}
161162
#endif
162163
status = lv1_net_start_rx_dma(bus_id(card), dev_id(card),
163-
card->rx_chain.head->bus_addr, 0);
164+
card->rx_chain.head->link.cpu_addr, 0);
164165
if (status)
165166
dev_info(ctodev(card),
166167
"lv1_net_start_rx_dma failed, status=%d\n", status);
@@ -195,8 +196,8 @@ static void gelic_card_disable_rxdmac(struct gelic_card *card)
195196
static void gelic_descr_set_status(struct gelic_descr *descr,
196197
enum gelic_descr_dma_status status)
197198
{
198-
descr->dmac_cmd_status = cpu_to_be32(status |
199-
(be32_to_cpu(descr->dmac_cmd_status) &
199+
descr->hw_regs.dmac_cmd_status = cpu_to_be32(status |
200+
(be32_to_cpu(descr->hw_regs.dmac_cmd_status) &
200201
~GELIC_DESCR_DMA_STAT_MASK));
201202
/*
202203
* dma_cmd_status field is used to indicate whether the descriptor
@@ -224,13 +225,14 @@ static void gelic_card_reset_chain(struct gelic_card *card,
224225

225226
for (descr = start_descr; start_descr != descr->next; descr++) {
226227
gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED);
227-
descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr);
228+
descr->hw_regs.next_descr_addr
229+
= cpu_to_be32(descr->next->link.cpu_addr);
228230
}
229231

230232
chain->head = start_descr;
231233
chain->tail = (descr - 1);
232234

233-
(descr - 1)->next_descr_addr = 0;
235+
(descr - 1)->hw_regs.next_descr_addr = 0;
234236
}
235237

236238
void gelic_card_up(struct gelic_card *card)
@@ -286,10 +288,12 @@ static void gelic_card_free_chain(struct gelic_card *card,
286288
{
287289
struct gelic_descr *descr;
288290

289-
for (descr = descr_in; descr && descr->bus_addr; descr = descr->next) {
290-
dma_unmap_single(ctodev(card), descr->bus_addr,
291-
GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL);
292-
descr->bus_addr = 0;
291+
for (descr = descr_in; descr && descr->link.cpu_addr;
292+
descr = descr->next) {
293+
dma_unmap_single(ctodev(card), descr->link.cpu_addr,
294+
descr->link.size, DMA_BIDIRECTIONAL);
295+
descr->link.cpu_addr = 0;
296+
descr->link.size = 0;
293297
}
294298
}
295299

@@ -317,17 +321,21 @@ static int gelic_card_init_chain(struct gelic_card *card,
317321

318322
/* set up the hardware pointers in each descriptor */
319323
for (i = 0; i < no; i++, descr++) {
320-
dma_addr_t cpu_addr;
321-
322324
gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
323325

324-
cpu_addr = dma_map_single(ctodev(card), descr,
325-
GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL);
326+
descr->link.size = sizeof(struct gelic_hw_regs);
327+
descr->link.cpu_addr = dma_map_single(ctodev(card), descr,
328+
descr->link.size, DMA_BIDIRECTIONAL);
326329

327-
if (dma_mapping_error(ctodev(card), cpu_addr))
328-
goto iommu_error;
330+
if (dma_mapping_error(ctodev(card), descr->link.cpu_addr)) {
331+
for (i--, descr--; 0 <= i; i--, descr--) {
332+
dma_unmap_single(ctodev(card),
333+
descr->link.cpu_addr, descr->link.size,
334+
DMA_BIDIRECTIONAL);
335+
}
336+
return -ENOMEM;
337+
}
329338

330-
descr->bus_addr = cpu_to_be32(cpu_addr);
331339
descr->next = descr + 1;
332340
descr->prev = descr - 1;
333341
}
@@ -338,24 +346,17 @@ static int gelic_card_init_chain(struct gelic_card *card,
338346
/* chain bus addr of hw descriptor */
339347
descr = start_descr;
340348
for (i = 0; i < no; i++, descr++) {
341-
descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr);
349+
descr->hw_regs.next_descr_addr =
350+
cpu_to_be32(descr->next->link.cpu_addr);
342351
}
343352

344353
chain->head = start_descr;
345354
chain->tail = start_descr;
346355

347356
/* do not chain last hw descriptor */
348-
(descr - 1)->next_descr_addr = 0;
357+
(descr - 1)->hw_regs.next_descr_addr = 0;
349358

350359
return 0;
351-
352-
iommu_error:
353-
for (i--, descr--; 0 <= i; i--, descr--)
354-
if (descr->bus_addr)
355-
dma_unmap_single(ctodev(card), descr->bus_addr,
356-
GELIC_DESCR_SIZE,
357-
DMA_BIDIRECTIONAL);
358-
return -ENOMEM;
359360
}
360361

361362
/**
@@ -385,14 +386,16 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
385386

386387
descr->skb = netdev_alloc_skb(*card->netdev, rx_skb_size);
387388
if (!descr->skb) {
388-
descr->buf_addr = 0; /* tell DMAC don't touch memory */
389+
descr->hw_regs.payload.dev_addr = 0; /* tell DMAC don't touch memory */
389390
return -ENOMEM;
390391
}
391-
descr->buf_size = cpu_to_be32(rx_skb_size);
392-
descr->dmac_cmd_status = 0;
393-
descr->result_size = 0;
394-
descr->valid_size = 0;
395-
descr->data_error = 0;
392+
descr->hw_regs.dmac_cmd_status = 0;
393+
descr->hw_regs.result_size = 0;
394+
descr->hw_regs.valid_size = 0;
395+
descr->hw_regs.data_error = 0;
396+
descr->hw_regs.payload.dev_addr = 0;
397+
descr->hw_regs.payload.size = 0;
398+
descr->skb = NULL;
396399

397400
offset = ((unsigned long)descr->skb->data) &
398401
(GELIC_NET_RXBUF_ALIGN - 1);
@@ -401,18 +404,22 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
401404
/* io-mmu-map the skb */
402405
cpu_addr = dma_map_single(ctodev(card), descr->skb->data,
403406
GELIC_NET_MAX_FRAME, DMA_FROM_DEVICE);
404-
descr->buf_addr = cpu_to_be32(cpu_addr);
407+
descr->hw_regs.payload.dev_addr = cpu_to_be32(cpu_addr);
405408
if (dma_mapping_error(ctodev(card), cpu_addr)) {
406409
dev_kfree_skb_any(descr->skb);
407410
descr->skb = NULL;
408411
dev_info(ctodev(card),
409412
"%s:Could not iommu-map rx buffer\n", __func__);
410413
gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
411414
return -ENOMEM;
412-
} else {
413-
gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED);
414-
return 0;
415415
}
416+
417+
descr->hw_regs.payload.size = cpu_to_be32(GELIC_NET_MAX_FRAME);
418+
descr->hw_regs.payload.dev_addr = cpu_to_be32(cpu_addr);
419+
420+
gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED);
421+
422+
return 0;
416423
}
417424

418425
/**
@@ -427,14 +434,15 @@ static void gelic_card_release_rx_chain(struct gelic_card *card)
427434
do {
428435
if (descr->skb) {
429436
dma_unmap_single(ctodev(card),
430-
be32_to_cpu(descr->buf_addr),
431-
descr->skb->len,
432-
DMA_FROM_DEVICE);
433-
descr->buf_addr = 0;
437+
be32_to_cpu(descr->hw_regs.payload.dev_addr),
438+
descr->skb->len,
439+
DMA_FROM_DEVICE);
440+
descr->hw_regs.payload.dev_addr = 0;
441+
descr->hw_regs.payload.size = 0;
434442
dev_kfree_skb_any(descr->skb);
435443
descr->skb = NULL;
436444
gelic_descr_set_status(descr,
437-
GELIC_DESCR_DMA_NOT_IN_USE);
445+
GELIC_DESCR_DMA_NOT_IN_USE);
438446
}
439447
descr = descr->next;
440448
} while (descr != card->rx_chain.head);
@@ -496,19 +504,20 @@ static void gelic_descr_release_tx(struct gelic_card *card,
496504
{
497505
struct sk_buff *skb = descr->skb;
498506

499-
BUG_ON(!(be32_to_cpu(descr->data_status) & GELIC_DESCR_TX_TAIL));
507+
BUG_ON(!(be32_to_cpu(descr->hw_regs.data_status) & GELIC_DESCR_TX_TAIL));
500508

501-
dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr), skb->len,
502-
DMA_TO_DEVICE);
509+
dma_unmap_single(ctodev(card),
510+
be32_to_cpu(descr->hw_regs.payload.dev_addr), skb->len,
511+
DMA_TO_DEVICE);
503512
dev_kfree_skb_any(skb);
504513

505-
descr->buf_addr = 0;
506-
descr->buf_size = 0;
507-
descr->next_descr_addr = 0;
508-
descr->result_size = 0;
509-
descr->valid_size = 0;
510-
descr->data_status = 0;
511-
descr->data_error = 0;
514+
descr->hw_regs.payload.dev_addr = 0;
515+
descr->hw_regs.payload.size = 0;
516+
descr->hw_regs.next_descr_addr = 0;
517+
descr->hw_regs.result_size = 0;
518+
descr->hw_regs.valid_size = 0;
519+
descr->hw_regs.data_status = 0;
520+
descr->hw_regs.data_error = 0;
512521
descr->skb = NULL;
513522

514523
/* set descr status */
@@ -701,27 +710,27 @@ static void gelic_descr_set_tx_cmdstat(struct gelic_descr *descr,
701710
struct sk_buff *skb)
702711
{
703712
if (skb->ip_summed != CHECKSUM_PARTIAL)
704-
descr->dmac_cmd_status =
713+
descr->hw_regs.dmac_cmd_status =
705714
cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM |
706715
GELIC_DESCR_TX_DMA_FRAME_TAIL);
707716
else {
708717
/* is packet ip?
709718
* if yes: tcp? udp? */
710719
if (skb->protocol == htons(ETH_P_IP)) {
711720
if (ip_hdr(skb)->protocol == IPPROTO_TCP)
712-
descr->dmac_cmd_status =
721+
descr->hw_regs.dmac_cmd_status =
713722
cpu_to_be32(GELIC_DESCR_DMA_CMD_TCP_CHKSUM |
714723
GELIC_DESCR_TX_DMA_FRAME_TAIL);
715724

716725
else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
717-
descr->dmac_cmd_status =
726+
descr->hw_regs.dmac_cmd_status =
718727
cpu_to_be32(GELIC_DESCR_DMA_CMD_UDP_CHKSUM |
719728
GELIC_DESCR_TX_DMA_FRAME_TAIL);
720729
else /*
721730
* the stack should checksum non-tcp and non-udp
722731
* packets on his own: NETIF_F_IP_CSUM
723732
*/
724-
descr->dmac_cmd_status =
733+
descr->hw_regs.dmac_cmd_status =
725734
cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM |
726735
GELIC_DESCR_TX_DMA_FRAME_TAIL);
727736
}
@@ -789,11 +798,11 @@ static int gelic_descr_prepare_tx(struct gelic_card *card,
789798
return -ENOMEM;
790799
}
791800

792-
descr->buf_addr = cpu_to_be32(buf);
793-
descr->buf_size = cpu_to_be32(skb->len);
801+
descr->hw_regs.payload.dev_addr = cpu_to_be32(buf);
802+
descr->hw_regs.payload.size = cpu_to_be32(skb->len);
794803
descr->skb = skb;
795-
descr->data_status = 0;
796-
descr->next_descr_addr = 0; /* terminate hw descr */
804+
descr->hw_regs.data_status = 0;
805+
descr->hw_regs.next_descr_addr = 0; /* terminate hw descr */
797806
gelic_descr_set_tx_cmdstat(descr, skb);
798807

799808
/* bump free descriptor pointer */
@@ -818,7 +827,7 @@ static int gelic_card_kick_txdma(struct gelic_card *card,
818827
if (gelic_descr_get_status(descr) == GELIC_DESCR_DMA_CARDOWNED) {
819828
card->tx_dma_progress = 1;
820829
status = lv1_net_start_tx_dma(bus_id(card), dev_id(card),
821-
descr->bus_addr, 0);
830+
descr->link.cpu_addr, 0);
822831
if (status) {
823832
card->tx_dma_progress = 0;
824833
dev_info(ctodev(card), "lv1_net_start_txdma failed," \
@@ -871,7 +880,8 @@ netdev_tx_t gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
871880
* link this prepared descriptor to previous one
872881
* to achieve high performance
873882
*/
874-
descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
883+
descr->prev->hw_regs.next_descr_addr =
884+
cpu_to_be32(descr->link.cpu_addr);
875885
/*
876886
* as hardware descriptor is modified in the above lines,
877887
* ensure that the hardware sees it
@@ -884,12 +894,12 @@ netdev_tx_t gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
884894
*/
885895
netdev->stats.tx_dropped++;
886896
/* don't trigger BUG_ON() in gelic_descr_release_tx */
887-
descr->data_status = cpu_to_be32(GELIC_DESCR_TX_TAIL);
897+
descr->hw_regs.data_status = cpu_to_be32(GELIC_DESCR_TX_TAIL);
888898
gelic_descr_release_tx(card, descr);
889899
/* reset head */
890900
card->tx_chain.head = descr;
891901
/* reset hw termination */
892-
descr->prev->next_descr_addr = 0;
902+
descr->prev->hw_regs.next_descr_addr = 0;
893903
dev_info(ctodev(card), "%s: kick failure\n", __func__);
894904
}
895905

@@ -914,21 +924,21 @@ static void gelic_net_pass_skb_up(struct gelic_descr *descr,
914924
struct sk_buff *skb = descr->skb;
915925
u32 data_status, data_error;
916926

917-
data_status = be32_to_cpu(descr->data_status);
918-
data_error = be32_to_cpu(descr->data_error);
927+
data_status = be32_to_cpu(descr->hw_regs.data_status);
928+
data_error = be32_to_cpu(descr->hw_regs.data_error);
919929
/* unmap skb buffer */
920-
dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr),
921-
GELIC_NET_MAX_FRAME,
922-
DMA_FROM_DEVICE);
923-
924-
skb_put(skb, be32_to_cpu(descr->valid_size)?
925-
be32_to_cpu(descr->valid_size) :
926-
be32_to_cpu(descr->result_size));
927-
if (!descr->valid_size)
930+
dma_unmap_single(ctodev(card),
931+
be32_to_cpu(descr->hw_regs.payload.dev_addr),
932+
be32_to_cpu(descr->hw_regs.payload.size), DMA_FROM_DEVICE);
933+
934+
skb_put(skb, be32_to_cpu(descr->hw_regs.valid_size)?
935+
be32_to_cpu(descr->hw_regs.valid_size) :
936+
be32_to_cpu(descr->hw_regs.result_size));
937+
if (!descr->hw_regs.valid_size)
928938
dev_info(ctodev(card), "buffer full %x %x %x\n",
929-
be32_to_cpu(descr->result_size),
930-
be32_to_cpu(descr->buf_size),
931-
be32_to_cpu(descr->dmac_cmd_status));
939+
be32_to_cpu(descr->hw_regs.result_size),
940+
be32_to_cpu(descr->hw_regs.payload.size),
941+
be32_to_cpu(descr->hw_regs.dmac_cmd_status));
932942

933943
descr->skb = NULL;
934944
/*
@@ -1039,14 +1049,14 @@ static int gelic_card_decode_one_descr(struct gelic_card *card)
10391049

10401050
/* is the current descriptor terminated with next_descr == NULL? */
10411051
dmac_chain_ended =
1042-
be32_to_cpu(descr->dmac_cmd_status) &
1052+
be32_to_cpu(descr->hw_regs.dmac_cmd_status) &
10431053
GELIC_DESCR_RX_DMA_CHAIN_END;
10441054
/*
10451055
* So that always DMAC can see the end
10461056
* of the descriptor chain to avoid
10471057
* from unwanted DMAC overrun.
10481058
*/
1049-
descr->next_descr_addr = 0;
1059+
descr->hw_regs.next_descr_addr = 0;
10501060

10511061
/* change the descriptor state: */
10521062
gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
@@ -1063,7 +1073,8 @@ static int gelic_card_decode_one_descr(struct gelic_card *card)
10631073
/*
10641074
* Set this descriptor the end of the chain.
10651075
*/
1066-
descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
1076+
descr->prev->hw_regs.next_descr_addr =
1077+
cpu_to_be32(descr->link.cpu_addr);
10671078

10681079
/*
10691080
* If dmac chain was met, DMAC stopped.

0 commit comments

Comments
 (0)