Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <geoff@infradead.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Geoff Levand and committed by
David S. Miller
3ce4f9c3 fb9bb704

+108 -91
+93 -82
drivers/net/ethernet/toshiba/ps3_gelic_net.c
··· 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) ··· 153 152 if (gelic_descr_get_status(card->rx_chain.head) != 154 153 GELIC_DESCR_DMA_CARDOWNED) { 155 154 printk(KERN_ERR "%s: status=%x\n", __func__, 156 - be32_to_cpu(card->rx_chain.head->dmac_cmd_status)); 155 + be32_to_cpu(card->rx_chain.head->hw_regs.dmac_cmd_status)); 157 156 printk(KERN_ERR "%s: nextphy=%x\n", __func__, 158 - be32_to_cpu(card->rx_chain.head->next_descr_addr)); 157 + be32_to_cpu(card->rx_chain.head->hw_regs.next_descr_addr)); 159 158 printk(KERN_ERR "%s: head=%p\n", __func__, 160 159 card->rx_chain.head); 161 160 } 162 161 #endif 163 162 status = lv1_net_start_rx_dma(bus_id(card), dev_id(card), 164 - card->rx_chain.head->bus_addr, 0); 163 + card->rx_chain.head->link.cpu_addr, 0); 165 164 if (status) 166 165 dev_info(ctodev(card), 167 166 "lv1_net_start_rx_dma failed, status=%d\n", status); ··· 196 195 static void gelic_descr_set_status(struct gelic_descr *descr, 197 196 enum gelic_descr_dma_status status) 198 197 { 199 - descr->dmac_cmd_status = cpu_to_be32(status | 200 - (be32_to_cpu(descr->dmac_cmd_status) & 198 + descr->hw_regs.dmac_cmd_status = cpu_to_be32(status | 199 + (be32_to_cpu(descr->hw_regs.dmac_cmd_status) & 201 200 ~GELIC_DESCR_DMA_STAT_MASK)); 202 201 /* 203 202 * dma_cmd_status field is used to indicate whether the descriptor ··· 225 224 226 225 for (descr = start_descr; start_descr != descr->next; descr++) { 227 226 gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED); 228 - descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr); 227 + descr->hw_regs.next_descr_addr 228 + = cpu_to_be32(descr->next->link.cpu_addr); 229 229 } 230 230 231 231 chain->head = start_descr; 232 232 chain->tail = (descr - 1); 233 233 234 - (descr - 1)->next_descr_addr = 0; 234 + (descr - 1)->hw_regs.next_descr_addr = 0; 235 235 } 236 236 237 237 void gelic_card_up(struct gelic_card *card) ··· 288 286 { 289 287 struct gelic_descr *descr; 290 288 291 - for (descr = descr_in; descr && descr->bus_addr; descr = descr->next) { 292 - dma_unmap_single(ctodev(card), descr->bus_addr, 293 - GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL); 294 - descr->bus_addr = 0; 289 + for (descr = descr_in; descr && descr->link.cpu_addr; 290 + descr = descr->next) { 291 + dma_unmap_single(ctodev(card), descr->link.cpu_addr, 292 + descr->link.size, DMA_BIDIRECTIONAL); 293 + descr->link.cpu_addr = 0; 294 + descr->link.size = 0; 295 295 } 296 296 } 297 297 ··· 321 317 322 318 /* set up the hardware pointers in each descriptor */ 323 319 for (i = 0; i < no; i++, descr++) { 324 - dma_addr_t cpu_addr; 325 - 326 320 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE); 327 321 328 - cpu_addr = dma_map_single(ctodev(card), descr, 329 - GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL); 322 + descr->link.size = sizeof(struct gelic_hw_regs); 323 + descr->link.cpu_addr = dma_map_single(ctodev(card), descr, 324 + descr->link.size, DMA_BIDIRECTIONAL); 330 325 331 - if (dma_mapping_error(ctodev(card), cpu_addr)) 332 - goto iommu_error; 326 + if (dma_mapping_error(ctodev(card), descr->link.cpu_addr)) { 327 + for (i--, descr--; 0 <= i; i--, descr--) { 328 + dma_unmap_single(ctodev(card), 329 + descr->link.cpu_addr, descr->link.size, 330 + DMA_BIDIRECTIONAL); 331 + } 332 + return -ENOMEM; 333 + } 333 334 334 - descr->bus_addr = cpu_to_be32(cpu_addr); 335 335 descr->next = descr + 1; 336 336 descr->prev = descr - 1; 337 337 } ··· 346 338 /* chain bus addr of hw descriptor */ 347 339 descr = start_descr; 348 340 for (i = 0; i < no; i++, descr++) { 349 - descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr); 341 + descr->hw_regs.next_descr_addr = 342 + cpu_to_be32(descr->next->link.cpu_addr); 350 343 } 351 344 352 345 chain->head = start_descr; 353 346 chain->tail = start_descr; 354 347 355 348 /* do not chain last hw descriptor */ 356 - (descr - 1)->next_descr_addr = 0; 349 + (descr - 1)->hw_regs.next_descr_addr = 0; 357 350 358 351 return 0; 359 - 360 - iommu_error: 361 - for (i--, descr--; 0 <= i; i--, descr--) 362 - if (descr->bus_addr) 363 - dma_unmap_single(ctodev(card), descr->bus_addr, 364 - GELIC_DESCR_SIZE, 365 - DMA_BIDIRECTIONAL); 366 - return -ENOMEM; 367 352 } 368 353 369 354 /** ··· 386 385 387 386 descr->skb = netdev_alloc_skb(*card->netdev, rx_skb_size); 388 387 if (!descr->skb) { 389 - descr->buf_addr = 0; /* tell DMAC don't touch memory */ 388 + descr->hw_regs.payload.dev_addr = 0; /* tell DMAC don't touch memory */ 390 389 return -ENOMEM; 391 390 } 392 - descr->buf_size = cpu_to_be32(rx_skb_size); 393 - descr->dmac_cmd_status = 0; 394 - descr->result_size = 0; 395 - descr->valid_size = 0; 396 - descr->data_error = 0; 391 + descr->hw_regs.dmac_cmd_status = 0; 392 + descr->hw_regs.result_size = 0; 393 + descr->hw_regs.valid_size = 0; 394 + descr->hw_regs.data_error = 0; 395 + descr->hw_regs.payload.dev_addr = 0; 396 + descr->hw_regs.payload.size = 0; 397 + descr->skb = NULL; 397 398 398 399 offset = ((unsigned long)descr->skb->data) & 399 400 (GELIC_NET_RXBUF_ALIGN - 1); ··· 404 401 /* io-mmu-map the skb */ 405 402 cpu_addr = dma_map_single(ctodev(card), descr->skb->data, 406 403 GELIC_NET_MAX_FRAME, DMA_FROM_DEVICE); 407 - descr->buf_addr = cpu_to_be32(cpu_addr); 404 + descr->hw_regs.payload.dev_addr = cpu_to_be32(cpu_addr); 408 405 if (dma_mapping_error(ctodev(card), cpu_addr)) { 409 406 dev_kfree_skb_any(descr->skb); 410 407 descr->skb = NULL; ··· 412 409 "%s:Could not iommu-map rx buffer\n", __func__); 413 410 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE); 414 411 return -ENOMEM; 415 - } else { 416 - gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED); 417 - return 0; 418 412 } 413 + 414 + descr->hw_regs.payload.size = cpu_to_be32(GELIC_NET_MAX_FRAME); 415 + descr->hw_regs.payload.dev_addr = cpu_to_be32(cpu_addr); 416 + 417 + gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED); 418 + 419 + return 0; 419 420 } 420 421 421 422 /** ··· 434 427 do { 435 428 if (descr->skb) { 436 429 dma_unmap_single(ctodev(card), 437 - be32_to_cpu(descr->buf_addr), 438 - descr->skb->len, 439 - DMA_FROM_DEVICE); 440 - descr->buf_addr = 0; 430 + be32_to_cpu(descr->hw_regs.payload.dev_addr), 431 + descr->skb->len, 432 + DMA_FROM_DEVICE); 433 + descr->hw_regs.payload.dev_addr = 0; 434 + descr->hw_regs.payload.size = 0; 441 435 dev_kfree_skb_any(descr->skb); 442 436 descr->skb = NULL; 443 437 gelic_descr_set_status(descr, 444 - GELIC_DESCR_DMA_NOT_IN_USE); 438 + GELIC_DESCR_DMA_NOT_IN_USE); 445 439 } 446 440 descr = descr->next; 447 441 } while (descr != card->rx_chain.head); ··· 504 496 { 505 497 struct sk_buff *skb = descr->skb; 506 498 507 - BUG_ON(!(be32_to_cpu(descr->data_status) & GELIC_DESCR_TX_TAIL)); 499 + BUG_ON(!(be32_to_cpu(descr->hw_regs.data_status) & GELIC_DESCR_TX_TAIL)); 508 500 509 - dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr), skb->len, 510 - DMA_TO_DEVICE); 501 + dma_unmap_single(ctodev(card), 502 + be32_to_cpu(descr->hw_regs.payload.dev_addr), skb->len, 503 + DMA_TO_DEVICE); 511 504 dev_kfree_skb_any(skb); 512 505 513 - descr->buf_addr = 0; 514 - descr->buf_size = 0; 515 - descr->next_descr_addr = 0; 516 - descr->result_size = 0; 517 - descr->valid_size = 0; 518 - descr->data_status = 0; 519 - descr->data_error = 0; 506 + descr->hw_regs.payload.dev_addr = 0; 507 + descr->hw_regs.payload.size = 0; 508 + descr->hw_regs.next_descr_addr = 0; 509 + descr->hw_regs.result_size = 0; 510 + descr->hw_regs.valid_size = 0; 511 + descr->hw_regs.data_status = 0; 512 + descr->hw_regs.data_error = 0; 520 513 descr->skb = NULL; 521 514 522 515 /* set descr status */ ··· 710 701 struct sk_buff *skb) 711 702 { 712 703 if (skb->ip_summed != CHECKSUM_PARTIAL) 713 - descr->dmac_cmd_status = 704 + descr->hw_regs.dmac_cmd_status = 714 705 cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM | 715 706 GELIC_DESCR_TX_DMA_FRAME_TAIL); 716 707 else { ··· 718 709 * if yes: tcp? udp? */ 719 710 if (skb->protocol == htons(ETH_P_IP)) { 720 711 if (ip_hdr(skb)->protocol == IPPROTO_TCP) 721 - descr->dmac_cmd_status = 712 + descr->hw_regs.dmac_cmd_status = 722 713 cpu_to_be32(GELIC_DESCR_DMA_CMD_TCP_CHKSUM | 723 714 GELIC_DESCR_TX_DMA_FRAME_TAIL); 724 715 725 716 else if (ip_hdr(skb)->protocol == IPPROTO_UDP) 726 - descr->dmac_cmd_status = 717 + descr->hw_regs.dmac_cmd_status = 727 718 cpu_to_be32(GELIC_DESCR_DMA_CMD_UDP_CHKSUM | 728 719 GELIC_DESCR_TX_DMA_FRAME_TAIL); 729 720 else /* 730 721 * the stack should checksum non-tcp and non-udp 731 722 * packets on his own: NETIF_F_IP_CSUM 732 723 */ 733 - descr->dmac_cmd_status = 724 + descr->hw_regs.dmac_cmd_status = 734 725 cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM | 735 726 GELIC_DESCR_TX_DMA_FRAME_TAIL); 736 727 } ··· 798 789 return -ENOMEM; 799 790 } 800 791 801 - descr->buf_addr = cpu_to_be32(buf); 802 - descr->buf_size = cpu_to_be32(skb->len); 792 + descr->hw_regs.payload.dev_addr = cpu_to_be32(buf); 793 + descr->hw_regs.payload.size = cpu_to_be32(skb->len); 803 794 descr->skb = skb; 804 - descr->data_status = 0; 805 - descr->next_descr_addr = 0; /* terminate hw descr */ 795 + descr->hw_regs.data_status = 0; 796 + descr->hw_regs.next_descr_addr = 0; /* terminate hw descr */ 806 797 gelic_descr_set_tx_cmdstat(descr, skb); 807 798 808 799 /* bump free descriptor pointer */ ··· 827 818 if (gelic_descr_get_status(descr) == GELIC_DESCR_DMA_CARDOWNED) { 828 819 card->tx_dma_progress = 1; 829 820 status = lv1_net_start_tx_dma(bus_id(card), dev_id(card), 830 - descr->bus_addr, 0); 821 + descr->link.cpu_addr, 0); 831 822 if (status) { 832 823 card->tx_dma_progress = 0; 833 824 dev_info(ctodev(card), "lv1_net_start_txdma failed," \ ··· 880 871 * link this prepared descriptor to previous one 881 872 * to achieve high performance 882 873 */ 883 - descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr); 874 + descr->prev->hw_regs.next_descr_addr = 875 + cpu_to_be32(descr->link.cpu_addr); 884 876 /* 885 877 * as hardware descriptor is modified in the above lines, 886 878 * ensure that the hardware sees it ··· 894 884 */ 895 885 netdev->stats.tx_dropped++; 896 886 /* don't trigger BUG_ON() in gelic_descr_release_tx */ 897 - descr->data_status = cpu_to_be32(GELIC_DESCR_TX_TAIL); 887 + descr->hw_regs.data_status = cpu_to_be32(GELIC_DESCR_TX_TAIL); 898 888 gelic_descr_release_tx(card, descr); 899 889 /* reset head */ 900 890 card->tx_chain.head = descr; 901 891 /* reset hw termination */ 902 - descr->prev->next_descr_addr = 0; 892 + descr->prev->hw_regs.next_descr_addr = 0; 903 893 dev_info(ctodev(card), "%s: kick failure\n", __func__); 904 894 } 905 895 ··· 924 914 struct sk_buff *skb = descr->skb; 925 915 u32 data_status, data_error; 926 916 927 - data_status = be32_to_cpu(descr->data_status); 928 - data_error = be32_to_cpu(descr->data_error); 917 + data_status = be32_to_cpu(descr->hw_regs.data_status); 918 + data_error = be32_to_cpu(descr->hw_regs.data_error); 929 919 /* unmap skb buffer */ 930 - dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr), 931 - GELIC_NET_MAX_FRAME, 932 - DMA_FROM_DEVICE); 920 + dma_unmap_single(ctodev(card), 921 + be32_to_cpu(descr->hw_regs.payload.dev_addr), 922 + be32_to_cpu(descr->hw_regs.payload.size), DMA_FROM_DEVICE); 933 923 934 - skb_put(skb, be32_to_cpu(descr->valid_size)? 935 - be32_to_cpu(descr->valid_size) : 936 - be32_to_cpu(descr->result_size)); 937 - if (!descr->valid_size) 924 + skb_put(skb, be32_to_cpu(descr->hw_regs.valid_size)? 925 + be32_to_cpu(descr->hw_regs.valid_size) : 926 + be32_to_cpu(descr->hw_regs.result_size)); 927 + if (!descr->hw_regs.valid_size) 938 928 dev_info(ctodev(card), "buffer full %x %x %x\n", 939 - be32_to_cpu(descr->result_size), 940 - be32_to_cpu(descr->buf_size), 941 - be32_to_cpu(descr->dmac_cmd_status)); 929 + be32_to_cpu(descr->hw_regs.result_size), 930 + be32_to_cpu(descr->hw_regs.payload.size), 931 + be32_to_cpu(descr->hw_regs.dmac_cmd_status)); 942 932 943 933 descr->skb = NULL; 944 934 /* ··· 1049 1039 1050 1040 /* is the current descriptor terminated with next_descr == NULL? */ 1051 1041 dmac_chain_ended = 1052 - be32_to_cpu(descr->dmac_cmd_status) & 1042 + be32_to_cpu(descr->hw_regs.dmac_cmd_status) & 1053 1043 GELIC_DESCR_RX_DMA_CHAIN_END; 1054 1044 /* 1055 1045 * So that always DMAC can see the end 1056 1046 * of the descriptor chain to avoid 1057 1047 * from unwanted DMAC overrun. 1058 1048 */ 1059 - descr->next_descr_addr = 0; 1049 + descr->hw_regs.next_descr_addr = 0; 1060 1050 1061 1051 /* change the descriptor state: */ 1062 1052 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE); ··· 1073 1063 /* 1074 1064 * Set this descriptor the end of the chain. 1075 1065 */ 1076 - descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr); 1066 + descr->prev->hw_regs.next_descr_addr = 1067 + cpu_to_be32(descr->link.cpu_addr); 1077 1068 1078 1069 /* 1079 1070 * If dmac chain was met, DMAC stopped.
+15 -9
drivers/net/ethernet/toshiba/ps3_gelic_net.h
··· 221 221 GELIC_LV1_PHY_ETHERNET_0 = 0x0000000000000002L, 222 222 }; 223 223 224 - /* size of hardware part of gelic descriptor */ 225 - #define GELIC_DESCR_SIZE (32) 226 - 227 224 enum gelic_port_type { 228 225 GELIC_PORT_ETHERNET_0 = 0, 229 226 GELIC_PORT_WIRELESS = 1, 230 227 GELIC_PORT_MAX 231 228 }; 232 229 233 - struct gelic_descr { 234 - /* as defined by the hardware */ 235 - __be32 buf_addr; 236 - __be32 buf_size; 230 + /* As defined by the gelic hardware device. */ 231 + struct gelic_hw_regs { 232 + struct { 233 + __be32 dev_addr; 234 + __be32 size; 235 + } __packed payload; 237 236 __be32 next_descr_addr; 238 237 __be32 dmac_cmd_status; 239 238 __be32 result_size; 240 239 __be32 valid_size; /* all zeroes for tx */ 241 240 __be32 data_status; 242 241 __be32 data_error; /* all zeroes for tx */ 242 + } __packed; 243 243 244 - /* used in the driver */ 244 + struct gelic_chain_link { 245 + dma_addr_t cpu_addr; 246 + unsigned int size; 247 + }; 248 + 249 + struct gelic_descr { 250 + struct gelic_hw_regs hw_regs; 251 + struct gelic_chain_link link; 245 252 struct sk_buff *skb; 246 - dma_addr_t bus_addr; 247 253 struct gelic_descr *next; 248 254 struct gelic_descr *prev; 249 255 } __attribute__((aligned(32)));