@@ -599,7 +599,7 @@ static void ssif_alert(struct i2c_client *client, enum i2c_alert_protocol type,
599599 flags = ipmi_ssif_lock_cond (ssif_info , & oflags );
600600 if (ssif_info -> waiting_alert ) {
601601 ssif_info -> waiting_alert = false;
602- del_timer (& ssif_info -> retry_timer );
602+ timer_delete (& ssif_info -> retry_timer );
603603 do_get = true;
604604 } else if (ssif_info -> curr_msg ) {
605605 ssif_info -> got_alert = true;
@@ -1268,8 +1268,8 @@ static void shutdown_ssif(void *send_info)
12681268 schedule_timeout (1 );
12691269
12701270 ssif_info -> stopping = true;
1271- del_timer_sync (& ssif_info -> watch_timer );
1272- del_timer_sync (& ssif_info -> retry_timer );
1271+ timer_delete_sync (& ssif_info -> watch_timer );
1272+ timer_delete_sync (& ssif_info -> retry_timer );
12731273 if (ssif_info -> thread ) {
12741274 complete (& ssif_info -> wake_thread );
12751275 kthread_stop (ssif_info -> thread );
@@ -1370,8 +1370,20 @@ static int ssif_detect(struct i2c_client *client, struct i2c_board_info *info)
13701370 rv = do_cmd (client , 2 , msg , & len , resp );
13711371 if (rv )
13721372 rv = - ENODEV ;
1373- else
1373+ else {
1374+ if (len < 3 ) {
1375+ rv = - ENODEV ;
1376+ } else {
1377+ struct ipmi_device_id id ;
1378+
1379+ rv = ipmi_demangle_device_id (resp [0 ] >> 2 , resp [1 ],
1380+ resp + 2 , len - 2 , & id );
1381+ if (rv )
1382+ rv = - ENODEV ; /* Error means a BMC probably isn't there. */
1383+ }
1384+ if (!rv && info )
13741385 strscpy (info -> type , DEVICE_NAME , I2C_NAME_SIZE );
1386+ }
13751387 kfree (resp );
13761388 return rv ;
13771389}
@@ -1706,6 +1718,16 @@ static int ssif_probe(struct i2c_client *client)
17061718 ipmi_addr_src_to_str (ssif_info -> addr_source ),
17071719 client -> addr , client -> adapter -> name , slave_addr );
17081720
1721+ /*
1722+ * Send a get device id command and validate its response to
1723+ * make sure a valid BMC is there.
1724+ */
1725+ rv = ssif_detect (client , NULL );
1726+ if (rv ) {
1727+ dev_err (& client -> dev , "Not present\n" );
1728+ goto out ;
1729+ }
1730+
17091731 /* Now check for system interface capabilities */
17101732 msg [0 ] = IPMI_NETFN_APP_REQUEST << 2 ;
17111733 msg [1 ] = IPMI_GET_SYSTEM_INTERFACE_CAPABILITIES_CMD ;
@@ -2087,6 +2109,7 @@ static const struct platform_device_id ssif_plat_ids[] = {
20872109 { "dmi-ipmi-ssif" , 0 },
20882110 { }
20892111};
2112+ MODULE_DEVICE_TABLE (platform , ssif_plat_ids );
20902113
20912114static struct platform_driver ipmi_driver = {
20922115 .driver = {
0 commit comments