Commit 79ef4a4dd44cd4f9942975b0f625bd01549a2aa9

Authored by Brian King
Committed by David S. Miller
1 parent 3449a2ab31

ibmveth: Remove use of bitfields

Removes the use of bitfields from the ibmveth driver. This results
in slightly smaller object code.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

Showing 2 changed files with 68 additions and 78 deletions Side-by-side Diff

drivers/net/ibmveth.c
... ... @@ -132,19 +132,29 @@
132 132 };
133 133  
134 134 /* simple methods of getting data from the current rxq entry */
  135 +static inline u32 ibmveth_rxq_flags(struct ibmveth_adapter *adapter)
  136 +{
  137 + return adapter->rx_queue.queue_addr[adapter->rx_queue.index].flags_off;
  138 +}
  139 +
  140 +static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter)
  141 +{
  142 + return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_TOGGLE) >> IBMVETH_RXQ_TOGGLE_SHIFT;
  143 +}
  144 +
135 145 static inline int ibmveth_rxq_pending_buffer(struct ibmveth_adapter *adapter)
136 146 {
137   - return (adapter->rx_queue.queue_addr[adapter->rx_queue.index].toggle == adapter->rx_queue.toggle);
  147 + return (ibmveth_rxq_toggle(adapter) == adapter->rx_queue.toggle);
138 148 }
139 149  
140 150 static inline int ibmveth_rxq_buffer_valid(struct ibmveth_adapter *adapter)
141 151 {
142   - return (adapter->rx_queue.queue_addr[adapter->rx_queue.index].valid);
  152 + return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_VALID);
143 153 }
144 154  
145 155 static inline int ibmveth_rxq_frame_offset(struct ibmveth_adapter *adapter)
146 156 {
147   - return (adapter->rx_queue.queue_addr[adapter->rx_queue.index].offset);
  157 + return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_OFF_MASK);
148 158 }
149 159  
150 160 static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter)
... ... @@ -154,7 +164,7 @@
154 164  
155 165 static inline int ibmveth_rxq_csum_good(struct ibmveth_adapter *adapter)
156 166 {
157   - return (adapter->rx_queue.queue_addr[adapter->rx_queue.index].csum_good);
  167 + return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_CSUM_GOOD);
158 168 }
159 169  
160 170 /* setup the initial settings for a buffer pool */
... ... @@ -254,9 +264,7 @@
254 264 correlator = ((u64)pool->index << 32) | index;
255 265 *(u64*)skb->data = correlator;
256 266  
257   - desc.desc = 0;
258   - desc.fields.valid = 1;
259   - desc.fields.length = pool->buff_size;
  267 + desc.fields.flags_len = IBMVETH_BUF_VALID | pool->buff_size;
260 268 desc.fields.address = dma_addr;
261 269  
262 270 lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc);
... ... @@ -397,9 +405,8 @@
397 405 return;
398 406 }
399 407  
400   - desc.desc = 0;
401   - desc.fields.valid = 1;
402   - desc.fields.length = adapter->rx_buff_pool[pool].buff_size;
  408 + desc.fields.flags_len = IBMVETH_BUF_VALID |
  409 + adapter->rx_buff_pool[pool].buff_size;
403 410 desc.fields.address = adapter->rx_buff_pool[pool].dma_addr[index];
404 411  
405 412 lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc);
... ... @@ -555,9 +562,7 @@
555 562 memcpy(&mac_address, netdev->dev_addr, netdev->addr_len);
556 563 mac_address = mac_address >> 16;
557 564  
558   - rxq_desc.desc = 0;
559   - rxq_desc.fields.valid = 1;
560   - rxq_desc.fields.length = adapter->rx_queue.queue_len;
  565 + rxq_desc.fields.flags_len = IBMVETH_BUF_VALID | adapter->rx_queue.queue_len;
561 566 rxq_desc.fields.address = adapter->rx_queue.queue_dma;
562 567  
563 568 ibmveth_debug_printk("buffer list @ 0x%p\n", adapter->buffer_list_addr);
... ... @@ -704,7 +709,7 @@
704 709 void (*done) (struct net_device *, u32))
705 710 {
706 711 struct ibmveth_adapter *adapter = dev->priv;
707   - union ibmveth_illan_attributes set_attr, clr_attr, ret_attr;
  712 + u64 set_attr, clr_attr, ret_attr;
708 713 long ret;
709 714 int rc1 = 0, rc2 = 0;
710 715 int restart = 0;
711 716  
712 717  
713 718  
714 719  
... ... @@ -716,21 +721,21 @@
716 721 adapter->pool_config = 0;
717 722 }
718 723  
719   - set_attr.desc = 0;
720   - clr_attr.desc = 0;
  724 + set_attr = 0;
  725 + clr_attr = 0;
721 726  
722 727 if (data)
723   - set_attr.fields.tcp_csum_offload_ipv4 = 1;
  728 + set_attr = IBMVETH_ILLAN_IPV4_TCP_CSUM;
724 729 else
725   - clr_attr.fields.tcp_csum_offload_ipv4 = 1;
  730 + clr_attr = IBMVETH_ILLAN_IPV4_TCP_CSUM;
726 731  
727   - ret = h_illan_attributes(adapter->vdev->unit_address, 0, 0, &ret_attr.desc);
  732 + ret = h_illan_attributes(adapter->vdev->unit_address, 0, 0, &ret_attr);
728 733  
729   - if (ret == H_SUCCESS && !ret_attr.fields.active_trunk &&
730   - !ret_attr.fields.trunk_priority &&
731   - ret_attr.fields.csum_offload_padded_pkt_support) {
732   - ret = h_illan_attributes(adapter->vdev->unit_address, clr_attr.desc,
733   - set_attr.desc, &ret_attr.desc);
  734 + if (ret == H_SUCCESS && !(ret_attr & IBMVETH_ILLAN_ACTIVE_TRUNK) &&
  735 + !(ret_attr & IBMVETH_ILLAN_TRUNK_PRI_MASK) &&
  736 + (ret_attr & IBMVETH_ILLAN_PADDED_PKT_CSUM)) {
  737 + ret = h_illan_attributes(adapter->vdev->unit_address, clr_attr,
  738 + set_attr, &ret_attr);
734 739  
735 740 if (ret != H_SUCCESS) {
736 741 rc1 = -EIO;
737 742  
... ... @@ -738,13 +743,13 @@
738 743 " %d rc=%ld\n", data, ret);
739 744  
740 745 ret = h_illan_attributes(adapter->vdev->unit_address,
741   - set_attr.desc, clr_attr.desc, &ret_attr.desc);
  746 + set_attr, clr_attr, &ret_attr);
742 747 } else
743 748 done(dev, data);
744 749 } else {
745 750 rc1 = -EIO;
746 751 ibmveth_error_printk("unable to change checksum offload settings."
747   - " %d rc=%ld ret_attr=%lx\n", data, ret, ret_attr.desc);
  752 + " %d rc=%ld ret_attr=%lx\n", data, ret, ret_attr);
748 753 }
749 754  
750 755 if (restart)
751 756  
... ... @@ -850,11 +855,9 @@
850 855 unsigned int tx_send_failed = 0;
851 856 unsigned int tx_map_failed = 0;
852 857  
853   - desc.desc = 0;
854   - desc.fields.length = skb->len;
  858 + desc.fields.flags_len = IBMVETH_BUF_VALID | skb->len;
855 859 desc.fields.address = dma_map_single(&adapter->vdev->dev, skb->data,
856   - desc.fields.length, DMA_TO_DEVICE);
857   - desc.fields.valid = 1;
  860 + skb->len, DMA_TO_DEVICE);
858 861  
859 862 if (skb->ip_summed == CHECKSUM_PARTIAL &&
860 863 ip_hdr(skb)->protocol != IPPROTO_TCP && skb_checksum_help(skb)) {
... ... @@ -866,8 +869,7 @@
866 869 if (skb->ip_summed == CHECKSUM_PARTIAL) {
867 870 unsigned char *buf = skb_transport_header(skb) + skb->csum_offset;
868 871  
869   - desc.fields.no_csum = 1;
870   - desc.fields.csum_good = 1;
  872 + desc.fields.flags_len |= (IBMVETH_BUF_NO_CSUM | IBMVETH_BUF_CSUM_GOOD);
871 873  
872 874 /* Need to zero out the checksum */
873 875 buf[0] = 0;
... ... @@ -893,7 +895,8 @@
893 895 if(lpar_rc != H_SUCCESS && lpar_rc != H_DROPPED) {
894 896 ibmveth_error_printk("tx: h_send_logical_lan failed with rc=%ld\n", lpar_rc);
895 897 ibmveth_error_printk("tx: valid=%d, len=%d, address=0x%08x\n",
896   - desc.fields.valid, desc.fields.length, desc.fields.address);
  898 + (desc.fields.flags_len & IBMVETH_BUF_VALID) ? 1 : 0,
  899 + skb->len, desc.fields.address);
897 900 tx_send_failed++;
898 901 tx_dropped++;
899 902 } else {
... ... @@ -903,7 +906,7 @@
903 906 }
904 907  
905 908 dma_unmap_single(&adapter->vdev->dev, desc.fields.address,
906   - desc.fields.length, DMA_TO_DEVICE);
  909 + skb->len, DMA_TO_DEVICE);
907 910  
908 911 out: spin_lock_irqsave(&adapter->stats_lock, flags);
909 912 adapter->stats.tx_dropped += tx_dropped;
... ... @@ -1108,7 +1111,7 @@
1108 1111 long ret;
1109 1112 struct net_device *netdev;
1110 1113 struct ibmveth_adapter *adapter;
1111   - union ibmveth_illan_attributes set_attr, ret_attr;
  1114 + u64 set_attr, ret_attr;
1112 1115  
1113 1116 unsigned char *mac_addr_p;
1114 1117 unsigned int *mcastFilterSize_p;
1115 1118  
1116 1119  
1117 1120  
... ... @@ -1202,23 +1205,20 @@
1202 1205  
1203 1206 ibmveth_debug_printk("registering netdev...\n");
1204 1207  
1205   - ret = h_illan_attributes(dev->unit_address, 0, 0, &ret_attr.desc);
  1208 + ret = h_illan_attributes(dev->unit_address, 0, 0, &ret_attr);
1206 1209  
1207   - if (ret == H_SUCCESS && !ret_attr.fields.active_trunk &&
1208   - !ret_attr.fields.trunk_priority &&
1209   - ret_attr.fields.csum_offload_padded_pkt_support) {
1210   - set_attr.desc = 0;
1211   - set_attr.fields.tcp_csum_offload_ipv4 = 1;
  1210 + if (ret == H_SUCCESS && !(ret_attr & IBMVETH_ILLAN_ACTIVE_TRUNK) &&
  1211 + !(ret_attr & IBMVETH_ILLAN_TRUNK_PRI_MASK) &&
  1212 + (ret_attr & IBMVETH_ILLAN_PADDED_PKT_CSUM)) {
  1213 + set_attr = IBMVETH_ILLAN_IPV4_TCP_CSUM;
1212 1214  
1213   - ret = h_illan_attributes(dev->unit_address, 0, set_attr.desc,
1214   - &ret_attr.desc);
  1215 + ret = h_illan_attributes(dev->unit_address, 0, set_attr, &ret_attr);
1215 1216  
1216 1217 if (ret == H_SUCCESS) {
1217 1218 adapter->rx_csum = 1;
1218 1219 netdev->features |= NETIF_F_IP_CSUM;
1219 1220 } else
1220   - ret = h_illan_attributes(dev->unit_address, set_attr.desc,
1221   - 0, &ret_attr.desc);
  1221 + ret = h_illan_attributes(dev->unit_address, set_attr, 0, &ret_attr);
1222 1222 }
1223 1223  
1224 1224 rc = register_netdev(netdev);
drivers/net/ibmveth.h
... ... @@ -39,6 +39,12 @@
39 39 #define IbmVethMcastRemoveFilter 0x2UL
40 40 #define IbmVethMcastClearFilterTable 0x3UL
41 41  
  42 +#define IBMVETH_ILLAN_PADDED_PKT_CSUM 0x0000000000002000ULL
  43 +#define IBMVETH_ILLAN_TRUNK_PRI_MASK 0x0000000000000F00ULL
  44 +#define IBMVETH_ILLAN_IPV6_TCP_CSUM 0x0000000000000004ULL
  45 +#define IBMVETH_ILLAN_IPV4_TCP_CSUM 0x0000000000000002ULL
  46 +#define IBMVETH_ILLAN_ACTIVE_TRUNK 0x0000000000000001ULL
  47 +
42 48 /* hcall macros */
43 49 #define h_register_logical_lan(ua, buflst, rxq, fltlst, mac) \
44 50 plpar_hcall_norets(H_REGISTER_LOGICAL_LAN, ua, buflst, rxq, fltlst, mac)
... ... @@ -151,13 +157,13 @@
151 157 };
152 158  
153 159 struct ibmveth_buf_desc_fields {
154   - u32 valid : 1;
155   - u32 toggle : 1;
156   - u32 reserved : 4;
157   - u32 no_csum : 1;
158   - u32 csum_good : 1;
159   - u32 length : 24;
160   - u32 address;
  160 + u32 flags_len;
  161 +#define IBMVETH_BUF_VALID 0x80000000
  162 +#define IBMVETH_BUF_TOGGLE 0x40000000
  163 +#define IBMVETH_BUF_NO_CSUM 0x02000000
  164 +#define IBMVETH_BUF_CSUM_GOOD 0x01000000
  165 +#define IBMVETH_BUF_LEN_MASK 0x00FFFFFF
  166 + u32 address;
161 167 };
162 168  
163 169 union ibmveth_buf_desc {
164 170  
... ... @@ -165,33 +171,17 @@
165 171 struct ibmveth_buf_desc_fields fields;
166 172 };
167 173  
168   -struct ibmveth_illan_attributes_fields {
169   - u32 reserved;
170   - u32 reserved2 : 18;
171   - u32 csum_offload_padded_pkt_support : 1;
172   - u32 reserved3 : 1;
173   - u32 trunk_priority : 4;
174   - u32 reserved4 : 5;
175   - u32 tcp_csum_offload_ipv6 : 1;
176   - u32 tcp_csum_offload_ipv4 : 1;
177   - u32 active_trunk : 1;
178   -};
179   -
180   -union ibmveth_illan_attributes {
181   - u64 desc;
182   - struct ibmveth_illan_attributes_fields fields;
183   -};
184   -
185 174 struct ibmveth_rx_q_entry {
186   - u16 toggle : 1;
187   - u16 valid : 1;
188   - u16 reserved : 4;
189   - u16 no_csum : 1;
190   - u16 csum_good : 1;
191   - u16 reserved2 : 8;
192   - u16 offset;
193   - u32 length;
194   - u64 correlator;
  175 + u32 flags_off;
  176 +#define IBMVETH_RXQ_TOGGLE 0x80000000
  177 +#define IBMVETH_RXQ_TOGGLE_SHIFT 31
  178 +#define IBMVETH_RXQ_VALID 0x40000000
  179 +#define IBMVETH_RXQ_NO_CSUM 0x02000000
  180 +#define IBMVETH_RXQ_CSUM_GOOD 0x01000000
  181 +#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF
  182 +
  183 + u32 length;
  184 + u64 correlator;
195 185 };
196 186  
197 187 #endif /* _IBMVETH_H */