mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 13:34:27 -04:00 
			
		
		
		
	ar71xx: ag71xx: add support for getting switch port link status
SVN-Revision: 29017
This commit is contained in:
		
							parent
							
								
									d0db89133c
								
							
						
					
					
						commit
						d2316b2a45
					
				| @ -96,6 +96,7 @@ | ||||
| #define AR7240_REG_PORT_BASE(_port)	(0x100 + (_port) * 0x100) | ||||
| 
 | ||||
| #define AR7240_REG_PORT_STATUS(_port)	(AR7240_REG_PORT_BASE((_port)) + 0x00) | ||||
| #define AR7240_PORT_STATUS_SPEED_S	0 | ||||
| #define AR7240_PORT_STATUS_SPEED_M	BITM(2) | ||||
| #define AR7240_PORT_STATUS_SPEED_10	0 | ||||
| #define AR7240_PORT_STATUS_SPEED_100	1 | ||||
| @ -207,6 +208,7 @@ struct ar7240sw { | ||||
| 	u8 vlan_table[AR7240_MAX_VLANS]; | ||||
| 	u8 vlan_tagged; | ||||
| 	u16 pvid[AR7240_NUM_PORTS]; | ||||
| 	char buf[80]; | ||||
| }; | ||||
| 
 | ||||
| struct ar7240sw_hw_stat { | ||||
| @ -645,6 +647,63 @@ ar7240_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const char * | ||||
| ar7240_speed_str(u32 status) | ||||
| { | ||||
| 	u32 speed; | ||||
| 
 | ||||
| 	speed = (status >> AR7240_PORT_STATUS_SPEED_S) & | ||||
| 					AR7240_PORT_STATUS_SPEED_M; | ||||
| 	switch (speed) { | ||||
| 	case AR7240_PORT_STATUS_SPEED_10: | ||||
| 		return "10baseT"; | ||||
| 	case AR7240_PORT_STATUS_SPEED_100: | ||||
| 		return "100baseT"; | ||||
| 	case AR7240_PORT_STATUS_SPEED_1000: | ||||
| 		return "1000baseT"; | ||||
| 	} | ||||
| 
 | ||||
| 	return "unknown"; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| ar7240_port_get_link(struct switch_dev *dev, const struct switch_attr *attr, | ||||
| 		     struct switch_val *val) | ||||
| { | ||||
| 	struct ar7240sw *as = sw_to_ar7240(dev); | ||||
| 	struct mii_bus *mii = as->mii_bus; | ||||
| 	u32 len; | ||||
| 	u32 status; | ||||
| 	int port; | ||||
| 
 | ||||
| 	port = val->port_vlan; | ||||
| 
 | ||||
| 	memset(as->buf, '\0', sizeof(as->buf)); | ||||
| 	status = ar7240sw_reg_read(mii, AR7240_REG_PORT_STATUS(port)); | ||||
| 
 | ||||
| 	if (status & AR7240_PORT_STATUS_LINK_UP) { | ||||
| 		len = snprintf(as->buf, sizeof(as->buf), | ||||
| 				"port:%d link:up speed:%s %s-duplex %s%s%s", | ||||
| 				port, | ||||
| 				ar7240_speed_str(status), | ||||
| 				(status & AR7240_PORT_STATUS_DUPLEX) ? | ||||
| 					"full" : "half", | ||||
| 				(status & AR7240_PORT_STATUS_TXFLOW) ? | ||||
| 					"txflow ": "", | ||||
| 				(status & AR7240_PORT_STATUS_RXFLOW) ? | ||||
| 					"rxflow " : "", | ||||
| 				(status & AR7240_PORT_STATUS_LINK_AUTO) ? | ||||
| 					"auto ": ""); | ||||
| 	} else { | ||||
| 		len = snprintf(as->buf, sizeof(as->buf), | ||||
| 			       "port:%d link:down", port); | ||||
| 	} | ||||
| 
 | ||||
| 	val->value.s = as->buf; | ||||
| 	val->len = len; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| ar7240_vtu_op(struct ar7240sw *as, u32 op, u32 val) | ||||
| @ -733,6 +792,14 @@ static struct switch_attr ar7240_globals[] = { | ||||
| }; | ||||
| 
 | ||||
| static struct switch_attr ar7240_port[] = { | ||||
| 	{ | ||||
| 		.type = SWITCH_TYPE_STRING, | ||||
| 		.name = "link", | ||||
| 		.description = "Get port link information", | ||||
| 		.max = 1, | ||||
| 		.set = NULL, | ||||
| 		.get = ar7240_port_get_link, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct switch_attr ar7240_vlan[] = { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user