aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ll_temac_main.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-03-08 15:21:04 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-03-08 15:21:04 -0500
commit988addf82e4c03739375279de73929580a2d4a6a (patch)
tree989ae1cd4e264bbad80c65f04480486246e7b9f3 /drivers/net/ll_temac_main.c
parent004c1c7096659d352b83047a7593e91d8a30e3c5 (diff)
parent25cf84cf377c0aae5dbcf937ea89bc7893db5176 (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.c25
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
227static 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
227static void temac_set_multicast_list(struct net_device *ndev) 234static 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
939static struct of_device_id temac_of_match[] __devinitdata = { 947static 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};
943MODULE_DEVICE_TABLE(of, temac_of_match); 954MODULE_DEVICE_TABLE(of, temac_of_match);