48
48
#define KSZPHY_INTCS_LINK_UP BIT(8)
49
49
#define KSZPHY_INTCS_ALL (KSZPHY_INTCS_LINK_UP |\
50
50
KSZPHY_INTCS_LINK_DOWN)
51
+ #define KSZPHY_INTCS_LINK_DOWN_STATUS BIT(2)
52
+ #define KSZPHY_INTCS_LINK_UP_STATUS BIT(0)
53
+ #define KSZPHY_INTCS_STATUS (KSZPHY_INTCS_LINK_DOWN_STATUS |\
54
+ KSZPHY_INTCS_LINK_UP_STATUS)
51
55
52
56
/* PHY Control 1 */
53
57
#define MII_KSZPHY_CTRL_1 0x1e
@@ -182,6 +186,24 @@ static int kszphy_config_intr(struct phy_device *phydev)
182
186
return phy_write (phydev , MII_KSZPHY_INTCS , temp );
183
187
}
184
188
189
+ static irqreturn_t kszphy_handle_interrupt (struct phy_device * phydev )
190
+ {
191
+ int irq_status ;
192
+
193
+ irq_status = phy_read (phydev , MII_KSZPHY_INTCS );
194
+ if (irq_status < 0 ) {
195
+ phy_error (phydev );
196
+ return IRQ_NONE ;
197
+ }
198
+
199
+ if ((irq_status & KSZPHY_INTCS_STATUS ))
200
+ return IRQ_NONE ;
201
+
202
+ phy_trigger_machine (phydev );
203
+
204
+ return IRQ_HANDLED ;
205
+ }
206
+
185
207
static int kszphy_rmii_clk_sel (struct phy_device * phydev , bool val )
186
208
{
187
209
int ctrl ;
@@ -1162,6 +1184,7 @@ static struct phy_driver ksphy_driver[] = {
1162
1184
.config_init = kszphy_config_init ,
1163
1185
.ack_interrupt = kszphy_ack_interrupt ,
1164
1186
.config_intr = kszphy_config_intr ,
1187
+ .handle_interrupt = kszphy_handle_interrupt ,
1165
1188
.suspend = genphy_suspend ,
1166
1189
.resume = genphy_resume ,
1167
1190
}, {
@@ -1174,6 +1197,7 @@ static struct phy_driver ksphy_driver[] = {
1174
1197
.config_init = kszphy_config_init ,
1175
1198
.ack_interrupt = kszphy_ack_interrupt ,
1176
1199
.config_intr = kszphy_config_intr ,
1200
+ .handle_interrupt = kszphy_handle_interrupt ,
1177
1201
.get_sset_count = kszphy_get_sset_count ,
1178
1202
.get_strings = kszphy_get_strings ,
1179
1203
.get_stats = kszphy_get_stats ,
@@ -1189,6 +1213,7 @@ static struct phy_driver ksphy_driver[] = {
1189
1213
.config_init = kszphy_config_init ,
1190
1214
.ack_interrupt = kszphy_ack_interrupt ,
1191
1215
.config_intr = kszphy_config_intr ,
1216
+ .handle_interrupt = kszphy_handle_interrupt ,
1192
1217
.get_sset_count = kszphy_get_sset_count ,
1193
1218
.get_strings = kszphy_get_strings ,
1194
1219
.get_stats = kszphy_get_stats ,
@@ -1205,6 +1230,7 @@ static struct phy_driver ksphy_driver[] = {
1205
1230
.config_aneg = ksz8041_config_aneg ,
1206
1231
.ack_interrupt = kszphy_ack_interrupt ,
1207
1232
.config_intr = kszphy_config_intr ,
1233
+ .handle_interrupt = kszphy_handle_interrupt ,
1208
1234
.get_sset_count = kszphy_get_sset_count ,
1209
1235
.get_strings = kszphy_get_strings ,
1210
1236
.get_stats = kszphy_get_stats ,
@@ -1220,6 +1246,7 @@ static struct phy_driver ksphy_driver[] = {
1220
1246
.config_init = kszphy_config_init ,
1221
1247
.ack_interrupt = kszphy_ack_interrupt ,
1222
1248
.config_intr = kszphy_config_intr ,
1249
+ .handle_interrupt = kszphy_handle_interrupt ,
1223
1250
.get_sset_count = kszphy_get_sset_count ,
1224
1251
.get_strings = kszphy_get_strings ,
1225
1252
.get_stats = kszphy_get_stats ,
@@ -1233,6 +1260,7 @@ static struct phy_driver ksphy_driver[] = {
1233
1260
.config_init = kszphy_config_init ,
1234
1261
.ack_interrupt = kszphy_ack_interrupt ,
1235
1262
.config_intr = kszphy_config_intr ,
1263
+ .handle_interrupt = kszphy_handle_interrupt ,
1236
1264
.get_sset_count = kszphy_get_sset_count ,
1237
1265
.get_strings = kszphy_get_strings ,
1238
1266
.get_stats = kszphy_get_stats ,
@@ -1249,6 +1277,7 @@ static struct phy_driver ksphy_driver[] = {
1249
1277
.config_init = kszphy_config_init ,
1250
1278
.ack_interrupt = kszphy_ack_interrupt ,
1251
1279
.config_intr = kszphy_config_intr ,
1280
+ .handle_interrupt = kszphy_handle_interrupt ,
1252
1281
.get_sset_count = kszphy_get_sset_count ,
1253
1282
.get_strings = kszphy_get_strings ,
1254
1283
.get_stats = kszphy_get_stats ,
@@ -1264,6 +1293,7 @@ static struct phy_driver ksphy_driver[] = {
1264
1293
.config_init = ksz8081_config_init ,
1265
1294
.ack_interrupt = kszphy_ack_interrupt ,
1266
1295
.config_intr = kszphy_config_intr ,
1296
+ .handle_interrupt = kszphy_handle_interrupt ,
1267
1297
.get_sset_count = kszphy_get_sset_count ,
1268
1298
.get_strings = kszphy_get_strings ,
1269
1299
.get_stats = kszphy_get_stats ,
@@ -1277,6 +1307,7 @@ static struct phy_driver ksphy_driver[] = {
1277
1307
.config_init = ksz8061_config_init ,
1278
1308
.ack_interrupt = kszphy_ack_interrupt ,
1279
1309
.config_intr = kszphy_config_intr ,
1310
+ .handle_interrupt = kszphy_handle_interrupt ,
1280
1311
.suspend = genphy_suspend ,
1281
1312
.resume = genphy_resume ,
1282
1313
}, {
@@ -1290,6 +1321,7 @@ static struct phy_driver ksphy_driver[] = {
1290
1321
.config_init = ksz9021_config_init ,
1291
1322
.ack_interrupt = kszphy_ack_interrupt ,
1292
1323
.config_intr = kszphy_config_intr ,
1324
+ .handle_interrupt = kszphy_handle_interrupt ,
1293
1325
.get_sset_count = kszphy_get_sset_count ,
1294
1326
.get_strings = kszphy_get_strings ,
1295
1327
.get_stats = kszphy_get_stats ,
@@ -1309,6 +1341,7 @@ static struct phy_driver ksphy_driver[] = {
1309
1341
.read_status = ksz9031_read_status ,
1310
1342
.ack_interrupt = kszphy_ack_interrupt ,
1311
1343
.config_intr = kszphy_config_intr ,
1344
+ .handle_interrupt = kszphy_handle_interrupt ,
1312
1345
.get_sset_count = kszphy_get_sset_count ,
1313
1346
.get_strings = kszphy_get_strings ,
1314
1347
.get_stats = kszphy_get_stats ,
@@ -1338,6 +1371,7 @@ static struct phy_driver ksphy_driver[] = {
1338
1371
.read_status = genphy_read_status ,
1339
1372
.ack_interrupt = kszphy_ack_interrupt ,
1340
1373
.config_intr = kszphy_config_intr ,
1374
+ .handle_interrupt = kszphy_handle_interrupt ,
1341
1375
.get_sset_count = kszphy_get_sset_count ,
1342
1376
.get_strings = kszphy_get_strings ,
1343
1377
.get_stats = kszphy_get_stats ,
0 commit comments