Commit 79ef4a4dd44cd4f9942975b0f625bd01549a2aa9
Committed by
David S. Miller
1 parent
3449a2ab31
Exists in
master
and in
7 other branches
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 */ |