net: dsa: mv88e6xxx: extract ATU data write access
Other ATU commands need to write the ATU data register. To ease the introduction of such commands, extract the ATU data write access from _mv88e6xxx_atu_load to its own function. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									70cc99d10c
								
							
						
					
					
						commit
						37705b7315
					
				| @ -1047,6 +1047,29 @@ static int _mv88e6xxx_atu_cmd(struct dsa_switch *ds, u16 cmd) | |||||||
| 	return _mv88e6xxx_atu_wait(ds); | 	return _mv88e6xxx_atu_wait(ds); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int _mv88e6xxx_atu_data_write(struct dsa_switch *ds, | ||||||
|  | 				     struct mv88e6xxx_atu_entry *entry) | ||||||
|  | { | ||||||
|  | 	u16 data = entry->state & GLOBAL_ATU_DATA_STATE_MASK; | ||||||
|  | 
 | ||||||
|  | 	if (entry->state != GLOBAL_ATU_DATA_STATE_UNUSED) { | ||||||
|  | 		unsigned int mask, shift; | ||||||
|  | 
 | ||||||
|  | 		if (entry->trunk) { | ||||||
|  | 			data |= GLOBAL_ATU_DATA_TRUNK; | ||||||
|  | 			mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK; | ||||||
|  | 			shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT; | ||||||
|  | 		} else { | ||||||
|  | 			mask = GLOBAL_ATU_DATA_PORT_VECTOR_MASK; | ||||||
|  | 			shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		data |= (entry->portv_trunkid << shift) & mask; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_ATU_DATA, data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int _mv88e6xxx_flush_fid(struct dsa_switch *ds, int fid) | static int _mv88e6xxx_flush_fid(struct dsa_switch *ds, int fid) | ||||||
| { | { | ||||||
| 	int ret; | 	int ret; | ||||||
| @ -1761,7 +1784,6 @@ static int _mv88e6xxx_atu_mac_read(struct dsa_switch *ds, unsigned char *addr) | |||||||
| static int _mv88e6xxx_atu_load(struct dsa_switch *ds, | static int _mv88e6xxx_atu_load(struct dsa_switch *ds, | ||||||
| 			       struct mv88e6xxx_atu_entry *entry) | 			       struct mv88e6xxx_atu_entry *entry) | ||||||
| { | { | ||||||
| 	u16 reg = 0; |  | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	ret = _mv88e6xxx_atu_wait(ds); | 	ret = _mv88e6xxx_atu_wait(ds); | ||||||
| @ -1772,24 +1794,7 @@ static int _mv88e6xxx_atu_load(struct dsa_switch *ds, | |||||||
| 	if (ret < 0) | 	if (ret < 0) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	if (entry->state != GLOBAL_ATU_DATA_STATE_UNUSED) { | 	ret = _mv88e6xxx_atu_data_write(ds, entry); | ||||||
| 		unsigned int mask, shift; |  | ||||||
| 
 |  | ||||||
| 		if (entry->trunk) { |  | ||||||
| 			reg |= GLOBAL_ATU_DATA_TRUNK; |  | ||||||
| 			mask = GLOBAL_ATU_DATA_TRUNK_ID_MASK; |  | ||||||
| 			shift = GLOBAL_ATU_DATA_TRUNK_ID_SHIFT; |  | ||||||
| 		} else { |  | ||||||
| 			mask = GLOBAL_ATU_DATA_PORT_VECTOR_MASK; |  | ||||||
| 			shift = GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		reg |= (entry->portv_trunkid << shift) & mask; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	reg |= entry->state & GLOBAL_ATU_DATA_STATE_MASK; |  | ||||||
| 
 |  | ||||||
| 	ret = _mv88e6xxx_reg_write(ds, REG_GLOBAL, GLOBAL_ATU_DATA, reg); |  | ||||||
| 	if (ret < 0) | 	if (ret < 0) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user