Merge branches 'pm-cpuidle', 'pm-opp' and 'pm-avs'
[cascardo/linux.git] / drivers / rapidio / rio-scan.c
index a63a380..23429bd 100644 (file)
@@ -49,15 +49,6 @@ struct rio_id_table {
 static int next_destid = 0;
 static int next_comptag = 1;
 
-static int rio_mport_phys_table[] = {
-       RIO_EFB_PAR_EP_ID,
-       RIO_EFB_PAR_EP_REC_ID,
-       RIO_EFB_SER_EP_ID,
-       RIO_EFB_SER_EP_REC_ID,
-       -1,
-};
-
-
 /**
  * rio_destid_alloc - Allocate next available destID for given network
  * @net: RIO network
@@ -380,10 +371,15 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
        if (rdev->pef & RIO_PEF_EXT_FEATURES) {
                rdev->efptr = result & 0xffff;
                rdev->phys_efptr = rio_mport_get_physefb(port, 0, destid,
-                                                        hopcount);
+                                               hopcount, &rdev->phys_rmap);
+               pr_debug("RIO: %s Register Map %d device\n",
+                        __func__, rdev->phys_rmap);
 
                rdev->em_efptr = rio_mport_get_feature(port, 0, destid,
                                                hopcount, RIO_EFB_ERR_MGMNT);
+               if (!rdev->em_efptr)
+                       rdev->em_efptr = rio_mport_get_feature(port, 0, destid,
+                                               hopcount, RIO_EFB_ERR_MGMNT_HS);
        }
 
        rio_mport_read_config_32(port, destid, hopcount, RIO_SRC_OPS_CAR,
@@ -445,7 +441,7 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
                        rio_route_clr_table(rdev, RIO_GLOBAL_TABLE, 0);
        } else {
                if (do_enum)
-                       /*Enable Input Output Port (transmitter reviever)*/
+                       /*Enable Input Output Port (transmitter receiver)*/
                        rio_enable_rx_tx_port(port, 0, destid, hopcount, 0);
 
                dev_set_name(&rdev->dev, "%02x:e:%04x", rdev->net->id,
@@ -481,10 +477,8 @@ cleanup:
 
 /**
  * rio_sport_is_active- Tests if a switch port has an active connection.
- * @port: Master port to send transaction
- * @destid: Associated destination ID for switch
- * @hopcount: Hopcount to reach switch
- * @sport: Switch port number
+ * @rdev: RapidIO device object
+ * @sp: Switch port number
  *
  * Reads the port error status CSR for a particular switch port to
  * determine if the port has an active link.  Returns
@@ -492,31 +486,12 @@ cleanup:
  * inactive.
  */
 static int
-rio_sport_is_active(struct rio_mport *port, u16 destid, u8 hopcount, int sport)
+rio_sport_is_active(struct rio_dev *rdev, int sp)
 {
        u32 result = 0;
-       u32 ext_ftr_ptr;
 
-       ext_ftr_ptr = rio_mport_get_efb(port, 0, destid, hopcount, 0);
-
-       while (ext_ftr_ptr) {
-               rio_mport_read_config_32(port, destid, hopcount,
-                                        ext_ftr_ptr, &result);
-               result = RIO_GET_BLOCK_ID(result);
-               if ((result == RIO_EFB_SER_EP_FREE_ID) ||
-                   (result == RIO_EFB_SER_EP_FREE_ID_V13P) ||
-                   (result == RIO_EFB_SER_EP_FREC_ID))
-                       break;
-
-               ext_ftr_ptr = rio_mport_get_efb(port, 0, destid, hopcount,
-                                               ext_ftr_ptr);
-       }
-
-       if (ext_ftr_ptr)
-               rio_mport_read_config_32(port, destid, hopcount,
-                                        ext_ftr_ptr +
-                                        RIO_PORT_N_ERR_STS_CSR(sport),
-                                        &result);
+       rio_read_config_32(rdev, RIO_DEV_PORT_N_ERR_STS_CSR(rdev, sp),
+                          &result);
 
        return result & RIO_PORT_N_ERR_STS_PORT_OK;
 }
@@ -655,9 +630,7 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
 
                        cur_destid = next_destid;
 
-                       if (rio_sport_is_active
-                           (port, RIO_ANY_DESTID(port->sys_size), hopcount,
-                            port_num)) {
+                       if (rio_sport_is_active(rdev, port_num)) {
                                pr_debug(
                                    "RIO: scanning device on port %d\n",
                                    port_num);
@@ -785,8 +758,7 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
                        if (RIO_GET_PORT_NUM(rdev->swpinfo) == port_num)
                                continue;
 
-                       if (rio_sport_is_active
-                           (port, destid, hopcount, port_num)) {
+                       if (rio_sport_is_active(rdev, port_num)) {
                                pr_debug(
                                    "RIO: scanning device on port %d\n",
                                    port_num);
@@ -831,21 +803,11 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
 static int rio_mport_is_active(struct rio_mport *port)
 {
        u32 result = 0;
-       u32 ext_ftr_ptr;
-       int *entry = rio_mport_phys_table;
-
-       do {
-               if ((ext_ftr_ptr =
-                    rio_mport_get_feature(port, 1, 0, 0, *entry)))
-                       break;
-       } while (*++entry >= 0);
-
-       if (ext_ftr_ptr)
-               rio_local_read_config_32(port,
-                                        ext_ftr_ptr +
-                                        RIO_PORT_N_ERR_STS_CSR(port->index),
-                                        &result);
 
+       rio_local_read_config_32(port,
+               port->phys_efptr +
+                       RIO_PORT_N_ERR_STS_CSR(port->index, port->phys_rmap),
+               &result);
        return result & RIO_PORT_N_ERR_STS_PORT_OK;
 }