diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-03-08 15:21:04 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-03-08 15:21:04 -0500 |
commit | 988addf82e4c03739375279de73929580a2d4a6a (patch) | |
tree | 989ae1cd4e264bbad80c65f04480486246e7b9f3 /drivers/net/ll_temac_main.c | |
parent | 004c1c7096659d352b83047a7593e91d8a30e3c5 (diff) | |
parent | 25cf84cf377c0aae5dbcf937ea89bc7893db5176 (diff) |
Merge branch 'origin' into devel-stable
Conflicts:
arch/arm/mach-mx2/devices.c
arch/arm/mach-mx2/devices.h
sound/soc/pxa/pxa-ssp.c
Diffstat (limited to 'drivers/net/ll_temac_main.c')
-rw-r--r-- | drivers/net/ll_temac_main.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c index a8522bd73ae7..a18e3485476e 100644 --- a/drivers/net/ll_temac_main.c +++ b/drivers/net/ll_temac_main.c | |||
@@ -224,6 +224,13 @@ static int temac_set_mac_address(struct net_device *ndev, void *address) | |||
224 | return 0; | 224 | return 0; |
225 | } | 225 | } |
226 | 226 | ||
227 | static int netdev_set_mac_address(struct net_device *ndev, void *p) | ||
228 | { | ||
229 | struct sockaddr *addr = p; | ||
230 | |||
231 | return temac_set_mac_address(ndev, addr->sa_data); | ||
232 | } | ||
233 | |||
227 | static void temac_set_multicast_list(struct net_device *ndev) | 234 | static void temac_set_multicast_list(struct net_device *ndev) |
228 | { | 235 | { |
229 | struct temac_local *lp = netdev_priv(ndev); | 236 | struct temac_local *lp = netdev_priv(ndev); |
@@ -232,7 +239,7 @@ static void temac_set_multicast_list(struct net_device *ndev) | |||
232 | 239 | ||
233 | mutex_lock(&lp->indirect_mutex); | 240 | mutex_lock(&lp->indirect_mutex); |
234 | if (ndev->flags & (IFF_ALLMULTI | IFF_PROMISC) || | 241 | if (ndev->flags & (IFF_ALLMULTI | IFF_PROMISC) || |
235 | ndev->mc_count > MULTICAST_CAM_TABLE_NUM) { | 242 | netdev_mc_count(ndev) > MULTICAST_CAM_TABLE_NUM) { |
236 | /* | 243 | /* |
237 | * We must make the kernel realise we had to move | 244 | * We must make the kernel realise we had to move |
238 | * into promisc mode or we start all out war on | 245 | * into promisc mode or we start all out war on |
@@ -242,10 +249,11 @@ static void temac_set_multicast_list(struct net_device *ndev) | |||
242 | ndev->flags |= IFF_PROMISC; | 249 | ndev->flags |= IFF_PROMISC; |
243 | temac_indirect_out32(lp, XTE_AFM_OFFSET, XTE_AFM_EPPRM_MASK); | 250 | temac_indirect_out32(lp, XTE_AFM_OFFSET, XTE_AFM_EPPRM_MASK); |
244 | dev_info(&ndev->dev, "Promiscuous mode enabled.\n"); | 251 | dev_info(&ndev->dev, "Promiscuous mode enabled.\n"); |
245 | } else if (ndev->mc_count) { | 252 | } else if (!netdev_mc_empty(ndev)) { |
246 | struct dev_mc_list *mclist = ndev->mc_list; | 253 | struct dev_mc_list *mclist; |
247 | for (i = 0; mclist && i < ndev->mc_count; i++) { | ||
248 | 254 | ||
255 | i = 0; | ||
256 | netdev_for_each_mc_addr(mclist, ndev) { | ||
249 | if (i >= MULTICAST_CAM_TABLE_NUM) | 257 | if (i >= MULTICAST_CAM_TABLE_NUM) |
250 | break; | 258 | break; |
251 | multi_addr_msw = ((mclist->dmi_addr[3] << 24) | | 259 | multi_addr_msw = ((mclist->dmi_addr[3] << 24) | |
@@ -258,7 +266,7 @@ static void temac_set_multicast_list(struct net_device *ndev) | |||
258 | (mclist->dmi_addr[4]) | (i << 16)); | 266 | (mclist->dmi_addr[4]) | (i << 16)); |
259 | temac_indirect_out32(lp, XTE_MAW1_OFFSET, | 267 | temac_indirect_out32(lp, XTE_MAW1_OFFSET, |
260 | multi_addr_lsw); | 268 | multi_addr_lsw); |
261 | mclist = mclist->next; | 269 | i++; |
262 | } | 270 | } |
263 | } else { | 271 | } else { |
264 | val = temac_indirect_in32(lp, XTE_AFM_OFFSET); | 272 | val = temac_indirect_in32(lp, XTE_AFM_OFFSET); |
@@ -615,7 +623,7 @@ static void ll_temac_recv(struct net_device *ndev) | |||
615 | while ((bdstat & STS_CTRL_APP0_CMPLT)) { | 623 | while ((bdstat & STS_CTRL_APP0_CMPLT)) { |
616 | 624 | ||
617 | skb = lp->rx_skb[lp->rx_bd_ci]; | 625 | skb = lp->rx_skb[lp->rx_bd_ci]; |
618 | length = cur_p->app4; | 626 | length = cur_p->app4 & 0x3FFF; |
619 | 627 | ||
620 | skb_vaddr = virt_to_bus(skb->data); | 628 | skb_vaddr = virt_to_bus(skb->data); |
621 | dma_unmap_single(ndev->dev.parent, skb_vaddr, length, | 629 | dma_unmap_single(ndev->dev.parent, skb_vaddr, length, |
@@ -768,7 +776,7 @@ static const struct net_device_ops temac_netdev_ops = { | |||
768 | .ndo_open = temac_open, | 776 | .ndo_open = temac_open, |
769 | .ndo_stop = temac_stop, | 777 | .ndo_stop = temac_stop, |
770 | .ndo_start_xmit = temac_start_xmit, | 778 | .ndo_start_xmit = temac_start_xmit, |
771 | .ndo_set_mac_address = temac_set_mac_address, | 779 | .ndo_set_mac_address = netdev_set_mac_address, |
772 | //.ndo_set_multicast_list = temac_set_multicast_list, | 780 | //.ndo_set_multicast_list = temac_set_multicast_list, |
773 | #ifdef CONFIG_NET_POLL_CONTROLLER | 781 | #ifdef CONFIG_NET_POLL_CONTROLLER |
774 | .ndo_poll_controller = temac_poll_controller, | 782 | .ndo_poll_controller = temac_poll_controller, |
@@ -938,6 +946,9 @@ static int __devexit temac_of_remove(struct of_device *op) | |||
938 | 946 | ||
939 | static struct of_device_id temac_of_match[] __devinitdata = { | 947 | static struct of_device_id temac_of_match[] __devinitdata = { |
940 | { .compatible = "xlnx,xps-ll-temac-1.01.b", }, | 948 | { .compatible = "xlnx,xps-ll-temac-1.01.b", }, |
949 | { .compatible = "xlnx,xps-ll-temac-2.00.a", }, | ||
950 | { .compatible = "xlnx,xps-ll-temac-2.02.a", }, | ||
951 | { .compatible = "xlnx,xps-ll-temac-2.03.a", }, | ||
941 | {}, | 952 | {}, |
942 | }; | 953 | }; |
943 | MODULE_DEVICE_TABLE(of, temac_of_match); | 954 | MODULE_DEVICE_TABLE(of, temac_of_match); |