ahci: use malloc_tmp memory for probing ports
authorGerd Hoffmann <kraxel@redhat.com>
Thu, 4 Aug 2011 17:36:31 +0000 (19:36 +0200)
committerKevin O'Connor <kevin@koconnor.net>
Sat, 6 Aug 2011 17:57:53 +0000 (13:57 -0400)
Also allocate the ahci port struct itself from tmp memory for probing,
then copy to fseg memory in case we detected some device.  This way we
don't waste fseg memory for unused ports.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
src/ahci.c

index ecdd3cb4dd9a34cd854dc1ecaf237457785cd6f8..9b3ce2f391f56bc4d6e8f282454574e146e01f9b 100644 (file)
@@ -383,7 +383,7 @@ ahci_port_reset(struct ahci_ctrl_s *ctrl, u32 pnr)
 static struct ahci_port_s*
 ahci_port_alloc(struct ahci_ctrl_s *ctrl, u32 pnr)
 {
-    struct ahci_port_s *port = malloc_fseg(sizeof(*port));
+    struct ahci_port_s *port = malloc_tmp(sizeof(*port));
 
     if (!port) {
         warn_noalloc();
@@ -407,10 +407,16 @@ ahci_port_alloc(struct ahci_ctrl_s *ctrl, u32 pnr)
     return port;
 }
 
-static void ahci_port_realloc(struct ahci_port_s *port)
+static struct ahci_port_s* ahci_port_realloc(struct ahci_port_s *port)
 {
+    struct ahci_port_s *tmp;
     u32 cmd;
 
+    tmp = malloc_fseg(sizeof(*port));
+    *tmp = *port;
+    free(port);
+    port = tmp;
+
     ahci_port_reset(port->ctrl, port->pnr);
 
     free(port->list);
@@ -426,6 +432,8 @@ static void ahci_port_realloc(struct ahci_port_s *port)
     cmd = ahci_port_readl(port->ctrl, port->pnr, PORT_CMD);
     cmd |= (PORT_CMD_FIS_RX|PORT_CMD_START);
     ahci_port_writel(port->ctrl, port->pnr, PORT_CMD, cmd);
+
+    return port;
 }
 
 static void ahci_port_release(struct ahci_port_s *port)
@@ -570,7 +578,7 @@ ahci_port_detect(void *data)
     if (rc < 0)
         ahci_port_release(port);
     else {
-        ahci_port_realloc(port);
+        port = ahci_port_realloc(port);
         dprintf(1, "AHCI/%d: registering: \"%s\"\n", port->pnr, port->desc);
         if (!port->atapi) {
             // Register with bcv system.