mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/drivers/net/b44.h
 | |
| +++ b/drivers/net/b44.h
 | |
| @@ -122,6 +122,7 @@
 | |
|  #define  RXCONFIG_FLOW		0x00000020 /* Flow Control Enable */
 | |
|  #define  RXCONFIG_FLOW_ACCEPT	0x00000040 /* Accept Unicast Flow Control Frame */
 | |
|  #define  RXCONFIG_RFILT		0x00000080 /* Reject Filter */
 | |
| +#define  RXCONFIG_CAM_ABSENT	0x00000100 /* CAM Absent */
 | |
|  #define B44_RXMAXLEN	0x0404UL /* EMAC RX Max Packet Length */
 | |
|  #define B44_TXMAXLEN	0x0408UL /* EMAC TX Max Packet Length */
 | |
|  #define B44_MDIO_CTRL	0x0410UL /* EMAC MDIO Control */
 | |
| --- a/drivers/net/b44.c
 | |
| +++ b/drivers/net/b44.c
 | |
| @@ -1299,6 +1299,7 @@ static int b44_set_mac_addr(struct net_d
 | |
|  {
 | |
|  	struct b44 *bp = dev->priv;
 | |
|  	struct sockaddr *addr = p;
 | |
| + 	u32 val;
 | |
|  
 | |
|  	if (netif_running(dev))
 | |
|  		return -EBUSY;
 | |
| @@ -1306,7 +1307,11 @@ static int b44_set_mac_addr(struct net_d
 | |
|  	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
 | |
|  
 | |
|  	spin_lock_irq(&bp->lock);
 | |
| -	__b44_set_mac_addr(bp);
 | |
| +   
 | |
| +   	val = br32(B44_RXCONFIG);
 | |
| +   	if (!(val & RXCONFIG_CAM_ABSENT))
 | |
| +		__b44_set_mac_addr(bp);
 | |
| +   
 | |
|  	spin_unlock_irq(&bp->lock);
 | |
|  
 | |
|  	return 0;
 | |
| @@ -1493,7 +1498,7 @@ static void __b44_set_rx_mode(struct net
 | |
|  
 | |
|  	val = br32(B44_RXCONFIG);
 | |
|  	val &= ~(RXCONFIG_PROMISC | RXCONFIG_ALLMULTI);
 | |
| -	if (dev->flags & IFF_PROMISC) {
 | |
| +	if ((dev->flags & IFF_PROMISC) || (val & RXCONFIG_CAM_ABSENT)) {
 | |
|  		val |= RXCONFIG_PROMISC;
 | |
|  		bw32(B44_RXCONFIG, val);
 | |
|  	} else {
 |