@@ -93,12 +93,13 @@ static void gelic_card_get_ether_port_status(struct gelic_card *card,
93
93
* gelic_descr_get_status -- returns the status of a descriptor
94
94
* @descr: descriptor to look at
95
95
*
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
97
97
*/
98
98
static enum gelic_descr_dma_status
99
99
gelic_descr_get_status (struct gelic_descr * descr )
100
100
{
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 ;
102
103
}
103
104
104
105
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)
152
153
if (gelic_descr_get_status (card -> rx_chain .head ) !=
153
154
GELIC_DESCR_DMA_CARDOWNED ) {
154
155
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 ));
156
157
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 ));
158
159
printk (KERN_ERR "%s: head=%p\n" , __func__ ,
159
160
card -> rx_chain .head );
160
161
}
161
162
#endif
162
163
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 );
164
165
if (status )
165
166
dev_info (ctodev (card ),
166
167
"lv1_net_start_rx_dma failed, status=%d\n" , status );
@@ -195,8 +196,8 @@ static void gelic_card_disable_rxdmac(struct gelic_card *card)
195
196
static void gelic_descr_set_status (struct gelic_descr * descr ,
196
197
enum gelic_descr_dma_status status )
197
198
{
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 ) &
200
201
~GELIC_DESCR_DMA_STAT_MASK ));
201
202
/*
202
203
* 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,
224
225
225
226
for (descr = start_descr ; start_descr != descr -> next ; descr ++ ) {
226
227
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 );
228
230
}
229
231
230
232
chain -> head = start_descr ;
231
233
chain -> tail = (descr - 1 );
232
234
233
- (descr - 1 )-> next_descr_addr = 0 ;
235
+ (descr - 1 )-> hw_regs . next_descr_addr = 0 ;
234
236
}
235
237
236
238
void gelic_card_up (struct gelic_card * card )
@@ -286,10 +288,12 @@ static void gelic_card_free_chain(struct gelic_card *card,
286
288
{
287
289
struct gelic_descr * descr ;
288
290
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 ;
293
297
}
294
298
}
295
299
@@ -317,17 +321,21 @@ static int gelic_card_init_chain(struct gelic_card *card,
317
321
318
322
/* set up the hardware pointers in each descriptor */
319
323
for (i = 0 ; i < no ; i ++ , descr ++ ) {
320
- dma_addr_t cpu_addr ;
321
-
322
324
gelic_descr_set_status (descr , GELIC_DESCR_DMA_NOT_IN_USE );
323
325
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 );
326
329
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
+ }
329
338
330
- descr -> bus_addr = cpu_to_be32 (cpu_addr );
331
339
descr -> next = descr + 1 ;
332
340
descr -> prev = descr - 1 ;
333
341
}
@@ -338,24 +346,17 @@ static int gelic_card_init_chain(struct gelic_card *card,
338
346
/* chain bus addr of hw descriptor */
339
347
descr = start_descr ;
340
348
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 );
342
351
}
343
352
344
353
chain -> head = start_descr ;
345
354
chain -> tail = start_descr ;
346
355
347
356
/* do not chain last hw descriptor */
348
- (descr - 1 )-> next_descr_addr = 0 ;
357
+ (descr - 1 )-> hw_regs . next_descr_addr = 0 ;
349
358
350
359
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 ;
359
360
}
360
361
361
362
/**
@@ -385,14 +386,16 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
385
386
386
387
descr -> skb = netdev_alloc_skb (* card -> netdev , rx_skb_size );
387
388
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 */
389
390
return - ENOMEM ;
390
391
}
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 ;
396
399
397
400
offset = ((unsigned long )descr -> skb -> data ) &
398
401
(GELIC_NET_RXBUF_ALIGN - 1 );
@@ -401,18 +404,22 @@ static int gelic_descr_prepare_rx(struct gelic_card *card,
401
404
/* io-mmu-map the skb */
402
405
cpu_addr = dma_map_single (ctodev (card ), descr -> skb -> data ,
403
406
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 );
405
408
if (dma_mapping_error (ctodev (card ), cpu_addr )) {
406
409
dev_kfree_skb_any (descr -> skb );
407
410
descr -> skb = NULL ;
408
411
dev_info (ctodev (card ),
409
412
"%s:Could not iommu-map rx buffer\n" , __func__ );
410
413
gelic_descr_set_status (descr , GELIC_DESCR_DMA_NOT_IN_USE );
411
414
return - ENOMEM ;
412
- } else {
413
- gelic_descr_set_status (descr , GELIC_DESCR_DMA_CARDOWNED );
414
- return 0 ;
415
415
}
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 ;
416
423
}
417
424
418
425
/**
@@ -427,14 +434,15 @@ static void gelic_card_release_rx_chain(struct gelic_card *card)
427
434
do {
428
435
if (descr -> skb ) {
429
436
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 ;
434
442
dev_kfree_skb_any (descr -> skb );
435
443
descr -> skb = NULL ;
436
444
gelic_descr_set_status (descr ,
437
- GELIC_DESCR_DMA_NOT_IN_USE );
445
+ GELIC_DESCR_DMA_NOT_IN_USE );
438
446
}
439
447
descr = descr -> next ;
440
448
} while (descr != card -> rx_chain .head );
@@ -496,19 +504,20 @@ static void gelic_descr_release_tx(struct gelic_card *card,
496
504
{
497
505
struct sk_buff * skb = descr -> skb ;
498
506
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 ));
500
508
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 );
503
512
dev_kfree_skb_any (skb );
504
513
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 ;
512
521
descr -> skb = NULL ;
513
522
514
523
/* set descr status */
@@ -701,27 +710,27 @@ static void gelic_descr_set_tx_cmdstat(struct gelic_descr *descr,
701
710
struct sk_buff * skb )
702
711
{
703
712
if (skb -> ip_summed != CHECKSUM_PARTIAL )
704
- descr -> dmac_cmd_status =
713
+ descr -> hw_regs . dmac_cmd_status =
705
714
cpu_to_be32 (GELIC_DESCR_DMA_CMD_NO_CHKSUM |
706
715
GELIC_DESCR_TX_DMA_FRAME_TAIL );
707
716
else {
708
717
/* is packet ip?
709
718
* if yes: tcp? udp? */
710
719
if (skb -> protocol == htons (ETH_P_IP )) {
711
720
if (ip_hdr (skb )-> protocol == IPPROTO_TCP )
712
- descr -> dmac_cmd_status =
721
+ descr -> hw_regs . dmac_cmd_status =
713
722
cpu_to_be32 (GELIC_DESCR_DMA_CMD_TCP_CHKSUM |
714
723
GELIC_DESCR_TX_DMA_FRAME_TAIL );
715
724
716
725
else if (ip_hdr (skb )-> protocol == IPPROTO_UDP )
717
- descr -> dmac_cmd_status =
726
+ descr -> hw_regs . dmac_cmd_status =
718
727
cpu_to_be32 (GELIC_DESCR_DMA_CMD_UDP_CHKSUM |
719
728
GELIC_DESCR_TX_DMA_FRAME_TAIL );
720
729
else /*
721
730
* the stack should checksum non-tcp and non-udp
722
731
* packets on his own: NETIF_F_IP_CSUM
723
732
*/
724
- descr -> dmac_cmd_status =
733
+ descr -> hw_regs . dmac_cmd_status =
725
734
cpu_to_be32 (GELIC_DESCR_DMA_CMD_NO_CHKSUM |
726
735
GELIC_DESCR_TX_DMA_FRAME_TAIL );
727
736
}
@@ -789,11 +798,11 @@ static int gelic_descr_prepare_tx(struct gelic_card *card,
789
798
return - ENOMEM ;
790
799
}
791
800
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 );
794
803
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 */
797
806
gelic_descr_set_tx_cmdstat (descr , skb );
798
807
799
808
/* bump free descriptor pointer */
@@ -818,7 +827,7 @@ static int gelic_card_kick_txdma(struct gelic_card *card,
818
827
if (gelic_descr_get_status (descr ) == GELIC_DESCR_DMA_CARDOWNED ) {
819
828
card -> tx_dma_progress = 1 ;
820
829
status = lv1_net_start_tx_dma (bus_id (card ), dev_id (card ),
821
- descr -> bus_addr , 0 );
830
+ descr -> link . cpu_addr , 0 );
822
831
if (status ) {
823
832
card -> tx_dma_progress = 0 ;
824
833
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)
871
880
* link this prepared descriptor to previous one
872
881
* to achieve high performance
873
882
*/
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 );
875
885
/*
876
886
* as hardware descriptor is modified in the above lines,
877
887
* ensure that the hardware sees it
@@ -884,12 +894,12 @@ netdev_tx_t gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
884
894
*/
885
895
netdev -> stats .tx_dropped ++ ;
886
896
/* 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 );
888
898
gelic_descr_release_tx (card , descr );
889
899
/* reset head */
890
900
card -> tx_chain .head = descr ;
891
901
/* reset hw termination */
892
- descr -> prev -> next_descr_addr = 0 ;
902
+ descr -> prev -> hw_regs . next_descr_addr = 0 ;
893
903
dev_info (ctodev (card ), "%s: kick failure\n" , __func__ );
894
904
}
895
905
@@ -914,21 +924,21 @@ static void gelic_net_pass_skb_up(struct gelic_descr *descr,
914
924
struct sk_buff * skb = descr -> skb ;
915
925
u32 data_status , data_error ;
916
926
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 );
919
929
/* 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 )
928
938
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 ));
932
942
933
943
descr -> skb = NULL ;
934
944
/*
@@ -1039,14 +1049,14 @@ static int gelic_card_decode_one_descr(struct gelic_card *card)
1039
1049
1040
1050
/* is the current descriptor terminated with next_descr == NULL? */
1041
1051
dmac_chain_ended =
1042
- be32_to_cpu (descr -> dmac_cmd_status ) &
1052
+ be32_to_cpu (descr -> hw_regs . dmac_cmd_status ) &
1043
1053
GELIC_DESCR_RX_DMA_CHAIN_END ;
1044
1054
/*
1045
1055
* So that always DMAC can see the end
1046
1056
* of the descriptor chain to avoid
1047
1057
* from unwanted DMAC overrun.
1048
1058
*/
1049
- descr -> next_descr_addr = 0 ;
1059
+ descr -> hw_regs . next_descr_addr = 0 ;
1050
1060
1051
1061
/* change the descriptor state: */
1052
1062
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)
1063
1073
/*
1064
1074
* Set this descriptor the end of the chain.
1065
1075
*/
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 );
1067
1078
1068
1079
/*
1069
1080
* If dmac chain was met, DMAC stopped.
0 commit comments