Changeset 30845
- Timestamp:
- 2012-03-07T17:32:42+01:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/target/linux/generic/files/drivers/net/phy/ar8216.c
r30838 r30845 175 175 } 176 176 177 static void 178 ar8216_read_port_link(struct ar8216_priv *priv, int port, 179 struct switch_port_link *link) 180 { 181 u32 status; 182 u32 speed; 183 184 memset(link, '\0', sizeof(*link)); 185 186 status = priv->read(priv, AR8216_REG_PORT_STATUS(port)); 187 188 link->aneg = !!(status & AR8216_PORT_STATUS_LINK_AUTO); 189 if (link->aneg) { 190 link->link = !!(status & AR8216_PORT_STATUS_LINK_UP); 191 if (!link->link) 192 return; 193 } else { 194 link->link = true; 195 } 196 197 link->duplex = !!(status & AR8216_PORT_STATUS_DUPLEX); 198 link->tx_flow = !!(status & AR8216_PORT_STATUS_TXFLOW); 199 link->rx_flow = !!(status & AR8216_PORT_STATUS_RXFLOW); 200 201 speed = (status & AR8216_PORT_STATUS_SPEED) >> 202 AR8216_PORT_STATUS_SPEED_S; 203 204 switch (speed) { 205 case AR8216_PORT_SPEED_10M: 206 link->speed = SWITCH_PORT_SPEED_10; 207 break; 208 case AR8216_PORT_SPEED_100M: 209 link->speed = SWITCH_PORT_SPEED_100; 210 break; 211 case AR8216_PORT_SPEED_1000M: 212 link->speed = SWITCH_PORT_SPEED_1000; 213 break; 214 default: 215 link->speed = SWITCH_PORT_SPEED_UNKNOWN; 216 break; 217 } 218 } 219 177 220 static int 178 221 ar8216_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, … … 234 277 } 235 278 236 static const char *ar8216_speed_str(unsigned speed) 237 { 238 switch (speed) { 239 case AR8216_PORT_SPEED_10M: 240 return "10baseT"; 241 case AR8216_PORT_SPEED_100M: 242 return "100baseT"; 243 case AR8216_PORT_SPEED_1000M: 244 return "1000baseT"; 245 } 246 247 return "unknown"; 248 } 249 250 static int ar8216_port_get_link(struct switch_dev *dev, 251 const struct switch_attr *attr, 252 struct switch_val *val) 279 static int 280 ar8216_get_port_link(struct switch_dev *dev, int port, 281 struct switch_port_link *link) 253 282 { 254 283 struct ar8216_priv *priv = to_ar8216(dev); 255 u32 len; 256 u32 status; 257 int port; 258 259 port = val->port_vlan; 260 261 memset(priv->buf, '\0', sizeof(priv->buf)); 262 status = priv->read(priv, AR8216_REG_PORT_STATUS(port)); 263 264 if (status & AR8216_PORT_STATUS_LINK_UP) { 265 len = snprintf(priv->buf, sizeof(priv->buf), 266 "port:%d link:up speed:%s %s-duplex %s%s%s", 267 port, 268 ar8216_speed_str((status & 269 AR8216_PORT_STATUS_SPEED) >> 270 AR8216_PORT_STATUS_SPEED_S), 271 (status & AR8216_PORT_STATUS_DUPLEX) ? 272 "full" : "half", 273 (status & AR8216_PORT_STATUS_TXFLOW) ? 274 "txflow ": "", 275 (status & AR8216_PORT_STATUS_RXFLOW) ? 276 "rxflow " : "", 277 (status & AR8216_PORT_STATUS_LINK_AUTO) ? 278 "auto ": ""); 279 } else { 280 len = snprintf(priv->buf, sizeof(priv->buf), "port:%d link:down", 281 port); 282 } 283 284 val->value.s = priv->buf; 285 val->len = len; 286 284 285 ar8216_read_port_link(priv, port, link); 287 286 return 0; 288 287 } … … 397 396 398 397 static struct switch_attr ar8216_port[] = { 399 {400 .type = SWITCH_TYPE_STRING,401 .name = "link",402 .description = "Get port link information",403 .max = 1,404 .set = NULL,405 .get = ar8216_port_get_link,406 },407 398 }; 408 399 … … 797 788 .apply_config = ar8216_hw_apply, 798 789 .reset_switch = ar8216_reset_switch, 790 .get_port_link = ar8216_get_port_link, 799 791 }; 800 792
Note: See TracChangeset
for help on using the changeset viewer.