Use the request_firmware() interface to get a SAS address from userspace.
This way, there's no debate as to who or how an address gets generated;
it's up to the administrator to provide one if the driver can't find one
on its own.
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
---
drivers/scsi/libsas/sas_scsi_host.c | 41 +++++++++++++++++++++++++++++++++++
include/scsi/libsas.h | 3 +++
2 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 7663841..0fa0296 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -24,6 +24,8 @@
*/
#include <linux/kthread.h>
+#include <linux/firmware.h>
+#include <linux/ctype.h>
#include "sas_internal.h"
@@ -1047,6 +1049,45 @@ void sas_target_destroy(struct scsi_target *starget)
return;
}
+static void sas_parse_addr(u8 *sas_addr, const char *p)
+{
+ int i;
+ for (i = 0; i < SAS_ADDR_SIZE; i++) {
+ u8 h, l;
+ if (!*p)
+ break;
+ h = isdigit(*p) ? *p-'0' : toupper(*p)-'A'+10;
+ p++;
+ l = isdigit(*p) ? *p-'0' : toupper(*p)-'A'+10;
+ p++;
+ sas_addr[i] = (h<<4) | l;
+ }
+}
+
+#define SAS_STRING_ADDR_SIZE 16
+
+int sas_request_addr(struct Scsi_Host *shost, u8 *addr)
+{
+ int res;
+ const struct firmware *fw;
+
+ res = request_firmware(&fw, "sas_addr", &shost->shost_gendev);
+ if (res)
+ return res;
+
+ if (fw->size < SAS_STRING_ADDR_SIZE) {
+ res = -ENODEV;
+ goto out;
+ }
+
+ sas_parse_addr(addr, fw->data);
+
+out:
+ release_firmware(fw);
+ return res;
+}
+EXPORT_SYMBOL_GPL(sas_request_addr);
+
EXPORT_SYMBOL_GPL(sas_queuecommand);
EXPORT_SYMBOL_GPL(sas_target_alloc);
EXPORT_SYMBOL_GPL(sas_slave_configure);
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
index 8dda2d6..58aa2aa 100644
--- a/include/scsi/libsas.h
+++ b/include/scsi/libsas.h
@@ -676,4 +676,7 @@ extern int sas_ioctl(struct scsi_device *sdev, int cmd, void __user *arg);
extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
struct request *req);
+
+int sas_request_addr(struct Scsi_Host *shost, u8 *addr);
+
#endif /* _SASLIB_H_ */
-
| James Bottomley | Re: Integration of SCST in the mainstream Linux kernel |
| Andy Whitcroft | Re: 2.6.23-rc6-mm1 |
| Dave Johnson | expected behavior of PF_PACKET on NETIF_F_HW_VLAN_RX device? |
| Anton Salikhmetov | [PATCH -v8 2/4] Update ctime and mtime for memory-mapped files |
git: | |
| Stephen Hemminger | git pull for update of netdev fails. |
| pavlix | GIT push to sftp (feature request) |
| Wincent Colaiuta | Possible to make a totally empty repository for remote access? |
| Andrew Morton | Untracked working tree files |
| Richard Stallman | Real men don't attack straw men |
| Aaron W. Hsu | Re: sudo & wheel group |
| Jason Dixon | Wasting our Freedom |
| Alex Thurlow | Router performance on OpenBSD and OpenBGPD |
| Jeff Garzik | Re: [bug?] tg3: Failed to load firmware "tigon/tg3_tso.bin" |
| Marc Pignat | Re: [PATCH] phylib: make mdio-gpio work without OF (v2) |
| Andrew Morton | Re: [Bugme-new] [Bug 11865] New: WOL for E100 Doesn't Work Anymore |
| Jeff Kirsher | [PATCH 1/3] e1000e: add support for the 82567LM-4 device |
| VPN's on NetBSD | 11 hours ago | NetBSD |
| Why does uClinux 2.6.18 bootup block SuperIO UART IRQs that BIOS configured | 12 hours ago | Linux kernel |
| USB statistics | 14 hours ago | Linux kernel |
| Block Sub System query | 18 hours ago | Linux kernel |
| kernel module to intercept socket creation | 19 hours ago | Linux kernel |
| Image size changing during each build | 19 hours ago | Linux kernel |
| Soft lock bug | 1 day ago | Linux kernel |
| sysctl - dynamic registration problem | 1 day ago | Linux kernel |
| Question on swap as ramdisk partition | 1 day ago | Linux kernel |
| serial driver xmit problem | 1 day ago | Linux kernel |
