realtek: rtl931x: Fix traffic on upper ports
* traffic isolation tables are different between rtl930x and rtl931x * traffic_enable/disable/get/set functions span multiple columns in the rtl931x as a result, previous implementation would only enable traffic in some ports. traffic_enable/disable and traffic_set/get should now work on all ports and not just the initial 32 Signed-off-by: Harshal Gohel <hg@simonwunderlich.de> Signed-off-by: Sharadanand Karanjkar <sk@simonwunderlich.de> Link: https://github.com/openwrt/openwrt/pull/19572 Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
		 Harshal Gohel
					Harshal Gohel
				
			
				
					committed by
					
						 Robert Marko
						Robert Marko
					
				
			
			
				
	
			
			
			 Robert Marko
						Robert Marko
					
				
			
						parent
						
							656312f9b7
						
					
				
				
					commit
					f51b54bc95
				
			| @@ -530,13 +530,15 @@ void rtl931x_set_receive_management_action(int port, rma_ctrl_t type, action_typ | |||||||
|  |  | ||||||
| static u64 rtl931x_traffic_get(int source) | static u64 rtl931x_traffic_get(int source) | ||||||
| { | { | ||||||
| 	u32 v; | 	u64 v; | ||||||
| 	struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6); | 	struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1); | ||||||
|  |  | ||||||
| 	rtl_table_read(r, source); | 	rtl_table_read(r, source); | ||||||
| 	v = sw_r32(rtl_table_data(r, 0)); | 	v = sw_r32(rtl_table_data(r, 0)); | ||||||
|  | 	v <<= 32; | ||||||
|  | 	v |= sw_r32(rtl_table_data(r, 1)); | ||||||
|  | 	v >>= 7; | ||||||
| 	rtl_table_release(r); | 	rtl_table_release(r); | ||||||
| 	v = v >> 3; |  | ||||||
|  |  | ||||||
| 	return v; | 	return v; | ||||||
| } | } | ||||||
| @@ -544,27 +546,28 @@ static u64 rtl931x_traffic_get(int source) | |||||||
| /* Enable traffic between a source port and a destination port matrix */ | /* Enable traffic between a source port and a destination port matrix */ | ||||||
| static void rtl931x_traffic_set(int source, u64 dest_matrix) | static void rtl931x_traffic_set(int source, u64 dest_matrix) | ||||||
| { | { | ||||||
| 	struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6); | 	struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1); | ||||||
|  |  | ||||||
| 	sw_w32((dest_matrix << 3), rtl_table_data(r, 0)); | 	sw_w32(dest_matrix >> (32 - 7), rtl_table_data(r, 0)); | ||||||
|  | 	sw_w32(dest_matrix << 7, rtl_table_data(r, 1)); | ||||||
| 	rtl_table_write(r, source); | 	rtl_table_write(r, source); | ||||||
| 	rtl_table_release(r); | 	rtl_table_release(r); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void rtl931x_traffic_enable(int source, int dest) | static void rtl931x_traffic_enable(int source, int dest) | ||||||
| { | { | ||||||
| 	struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6); | 	struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1); | ||||||
| 	rtl_table_read(r, source); | 	rtl_table_read(r, source); | ||||||
| 	sw_w32_mask(0, BIT(dest + 3), rtl_table_data(r, 0)); | 	sw_w32_mask(0, BIT((dest + 7) % 32), rtl_table_data(r, (dest + 7) / 32 ? 0 : 1)); | ||||||
| 	rtl_table_write(r, source); | 	rtl_table_write(r, source); | ||||||
| 	rtl_table_release(r); | 	rtl_table_release(r); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void rtl931x_traffic_disable(int source, int dest) | static void rtl931x_traffic_disable(int source, int dest) | ||||||
| { | { | ||||||
| 	struct table_reg *r = rtl_table_get(RTL9310_TBL_0, 6); | 	struct table_reg *r = rtl_table_get(RTL9310_TBL_2, 1); | ||||||
| 	rtl_table_read(r, source); | 	rtl_table_read(r, source); | ||||||
| 	sw_w32_mask(BIT(dest + 3), 0, rtl_table_data(r, 0)); | 	sw_w32_mask(BIT((dest + 7) % 32), 0, rtl_table_data(r, (dest + 7) / 32 ? 0 : 1)); | ||||||
| 	rtl_table_write(r, source); | 	rtl_table_write(r, source); | ||||||
| 	rtl_table_release(r); | 	rtl_table_release(r); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user