From: Luben Tuikov <ltuikov@yahoo.com>
To: Alexis Bruemmer <alexisb@us.ibm.com>,
linux-scsi <linux-scsi@vger.kernel.org>
Subject: Re: [PATCH 4/8] aic94xx: remove expander_conf.c
Date: Tue, 9 May 2006 23:56:39 -0700 (PDT) [thread overview]
Message-ID: <20060510065639.36451.qmail@web31802.mail.mud.yahoo.com> (raw)
In-Reply-To: <1147210267.11847.51.camel@localhost.localdomain>
--- Alexis Bruemmer <alexisb@us.ibm.com> wrote:
> Remove expander_conf.c from the kernel tree
>
> Signed-off-by: Alexis Bruemmer <alexisb@us.ibm.com>
> Signed-off-by: Mike Anderson <andmike@us.ibm.com>
It is easy to delete files. It is not easy to write them.
What is the immediate replacement for "expander_conf.c"?
I.e. what is the immediate replacement for a utility
which can address any expander on the domain and issue
SMP functions to it?
Luben
>
> ---
> drivers/scsi/sas/expander_conf.c | 463 ---------------------------------------
> drivers/scsi/sas/Makefile | 2
> 2 files changed, 465 deletions(-)
>
> Index: aic94xx-sas-2.6-patched/drivers/scsi/sas/Makefile
> ===================================================================
> --- aic94xx-sas-2.6-patched.orig/drivers/scsi/sas/Makefile
> +++ aic94xx-sas-2.6-patched/drivers/scsi/sas/Makefile
> @@ -26,8 +26,6 @@ ifeq ($(CONFIG_SCSI_SAS_DOMAIN_DEBUG),y)
> EXTRA_CFLAGS += -DSAS_DEBUG -g
> endif
>
> -clean-files += expander_conf
> -
> obj-$(CONFIG_SCSI_SAS_DOMAIN_ATTRS) += scsi_transport_sas_domain.o
> scsi_transport_sas_domain-y += sas_init.o \
> sas_phy.o \
> Index: aic94xx-sas-2.6-patched/drivers/scsi/sas/expander_conf.c
> ===================================================================
> --- aic94xx-sas-2.6-patched.orig/drivers/scsi/sas/expander_conf.c
> +++ /dev/null
> @@ -1,463 +0,0 @@
> -/*
> - * Serial Attached SCSI (SAS) Expander communication user space program
> - *
> - * Copyright (C) 2005 Adaptec, Inc. All rights reserved.
> - * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
> - *
> - * This file is licensed under GPLv2.
> - *
> - * This program is free software; you can redistribute it and/or
> - * modify it under the terms of the GNU General Public License as
> - * published by the Free Software Foundation; either version 2 of the
> - * License, or (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful, but
> - * WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - * General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> - *
> - * $Id: //depot/sas-class/expander_conf.c#7 $
> - */
> -
> -/* This is a simple program to show how to communicate with
> - * expander devices in a SAS domain.
> - *
> - * The process is simple:
> - * 1. Build the SMP frame you want to send. The format and layout
> - * is described in the SAS spec. Leave the CRC field equal 0.
> - * 2. Open the expander's SMP portal sysfs file in RW mode.
> - * 3. Write the frame you built in 1.
> - * 4. Read the amount of data you expect to receive for the frame you built.
> - * If you receive different amount of data you expected to receive,
> - * then there was some kind of error.
> - * All this process is shown in detail in the function do_smp_func()
> - * and its callers, below.
> - */
> -
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <fcntl.h>
> -#include <unistd.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <string.h>
> -#include <errno.h>
> -#include <endian.h>
> -#include <byteswap.h>
> -#include <stdint.h>
> -#include <stdlib.h>
> -
> -#define LEFT_FIELD_SIZE 25
> -
> -#ifdef __LITTLE_ENDIAN
> -#define be64_to_cpu(_x) __bswap_64(*(uint64_t *)(&(_x)))
> -#define be32_to_cpu(_x) __bswap_32(*(uint32_t *)(&(_x)))
> -#define be16_to_cpu(_x) __bswap_16(*(uint16_t *)(&(_x)))
> -#define cpu_to_be64(_x) __bswap_64(*(uint64_t *)(&(_x)))
> -#define cpu_to_be32(_x) __bswap_32(*(uint32_t *)(&(_x)))
> -#define cpu_to_be16(_x) __bswap_16(*(uint16_t *)(&(_x)))
> -#else
> -#define be64_to_cpu(_x) (_x)
> -#define be32_to_cpu(_x) (_x)
> -#define be16_to_cpu(_x) (_x)
> -#define cpu_to_be64(_x) (_x)
> -#define cpu_to_be32(_x) (_x)
> -#define cpu_to_be16(_x) (_x)
> -#endif
> -
> -#define SAS_ADDR(_x) ((unsigned long long) be64_to_cpu(*(uint64_t *)(_x)))
> -#define SAS_ADDR_SIZE 8
> -
> -const char *prog;
> -
> -struct route_table_entry {
> - int disabled;
> - uint8_t routed_sas_addr[SAS_ADDR_SIZE];
> -};
> -
> -struct expander {
> - int num_phys;
> - uint8_t *phy_attr;
> - int route_indexes;
> -};
> -
> -static int do_smp_func(char *smp_portal_name, void *smp_req, int smp_req_size,
> - void *smp_resp, int smp_resp_size)
> -{
> - int fd;
> - ssize_t res;
> -
> - fd = open(smp_portal_name, O_RDWR);
> - if (fd == -1) {
> - printf("%s: opening %s: %s(%d)\n", prog, smp_portal_name,
> - strerror(errno), errno);
> - return fd;
> - }
> -
> - res = write(fd, smp_req, smp_req_size);
> - if (!res) {
> - printf("%s: nothing could be written to %s\n", prog,
> - smp_portal_name);
> - goto out_err;
> - } else if (res == -1) {
> - printf("%s: writing to %s: %s(%d)\n", prog, smp_portal_name,
> - strerror(errno), errno);
> - goto out_err;
> - }
> -
> - res = read(fd, smp_resp, smp_resp_size);
> - if (!res) {
> - printf("%s: nothing could be read from %s\n", prog,
> - smp_portal_name);
> - goto out_err;
> - } else if (res == -1) {
> - printf("%s: reading from %s: %s(%d)\n", prog, smp_portal_name,
> - strerror(errno), errno);
> - goto out_err;
> - }
> - close(fd);
> - return res;
> - out_err:
> - close(fd);
> - return -1;
> -}
> -
> -#define MI_REQ_SIZE 8
> -#define MI_RESP_SIZE 64
> -
> -static unsigned char mi_req[MI_REQ_SIZE] = { 0x40, 1, 0, };
> -static unsigned char mi_resp[MI_RESP_SIZE];
> -
> -#define MI_FIELD_SIZE 20
> -#define MI_PRINTS(a, b) printf("%*s %*s\n",LEFT_FIELD_SIZE,a,MI_FIELD_SIZE,b)
> -#define MI_PRINTD(a, b) printf("%*s %*u\n",LEFT_FIELD_SIZE,a,MI_FIELD_SIZE,b)
> -#define MI_PRINTA(a, b) printf("%*s %0*llx\n",LEFT_FIELD_SIZE,a,MI_FIELD_SIZE,b)
> -
> -static int mi_expander(char *smp_portal_name, struct expander *ex)
> -{
> - int res;
> -
> - res = do_smp_func(smp_portal_name, mi_req, MI_REQ_SIZE,
> - mi_resp, MI_RESP_SIZE);
> - if (res == MI_RESP_SIZE && mi_resp[2] == 0) {
> - char buf[20];
> -
> - memcpy(buf, mi_resp+12, 8);
> - buf[8] = 0;
> - MI_PRINTS("Vendor:", buf);
> -
> - memcpy(buf, mi_resp+20, 16);
> - buf[16] = 0;
> - MI_PRINTS("Product:", buf);
> -
> - memcpy(buf, mi_resp+36, 4);
> - buf[4] = 0;
> - MI_PRINTS("Revision:", buf);
> -
> - if (!(mi_resp[8] & 1))
> - return 0;
> -
> - memcpy(buf, mi_resp+40, 8);
> - buf[8] = 0;
> - MI_PRINTS("Component:", buf);
> -
> - MI_PRINTD("Component ID:", be16_to_cpu(mi_resp[48]));
> - MI_PRINTD("Component revision:", mi_resp[50]);
> - }
> - return 0;
> -}
> -
> -#define RG_REQ_SIZE 8
> -#define RG_RESP_SIZE 32
> -
> -static unsigned char rg_req[RG_REQ_SIZE] = { 0x40, 0, };
> -static unsigned char rg_resp[RG_RESP_SIZE];
> -
> -static int rg_expander(char *smp_portal_name, struct expander *ex)
> -{
> - int res;
> -
> - res = do_smp_func(smp_portal_name, rg_req, RG_REQ_SIZE, rg_resp,
> - RG_RESP_SIZE);
> -
> - if (res == RG_RESP_SIZE && rg_resp[2] == 0) {
> - MI_PRINTD("Expander Change Count:", be16_to_cpu(rg_resp[4]));
> - MI_PRINTD("Expander Route Indexes:", be16_to_cpu(rg_resp[6]));
> - ex->route_indexes = be16_to_cpu(rg_resp[6]);
> - MI_PRINTD("Number of phys:", rg_resp[9]);
> - ex->num_phys = rg_resp[9];
> - MI_PRINTS("Configuring:", (rg_resp[10] & 2) ? "Yes" : "No");
> - MI_PRINTS("Configurable route table:",
> - (rg_resp[10] & 1) ? "Yes" : "No");
> - MI_PRINTA("Enclosure Logical Identifier:",
> - SAS_ADDR(rg_resp+12));
> - ex->phy_attr = malloc(ex->num_phys * sizeof(*ex->phy_attr));
> - }
> - return 0;
> -}
> -
> -#define DISCOVER_REQ_SIZE 16
> -#define DISCOVER_RESP_SIZE 56
> -
> -static unsigned char disc_req[DISCOVER_REQ_SIZE] = {0x40, 0x10, 0, };
> -static unsigned char disc_resp[DISCOVER_RESP_SIZE];
> -
> -#define PHY_EEXIST 0x10
> -#define PHY_VACANT 0x16
> -
> -static const char *attached_dev_type[8] = {
> - [0] = "none",
> - [1] = "end device",
> - [2] = "edge expander",
> - [3] = "fanout expander",
> - [4 ... 7] = "unknown",
> -};
> -
> -static const char *phy_link_rate[16] = {
> - [0] = "unknown",
> - [1] = "disabled",
> - [2] = "phy reset problem",
> - [3] = "spinup hold",
> - [4] = "port selector",
> - [5 ... 7] = "unknown",
> - [8] = "G1 (1,5 Gb/s)",
> - [9] = "G2 (3 GB/s)",
> - [10 ... 15] = "Unknown",
> -};
> -
> -static const char *proto_table[8] = {
> - "",
> - "SMP", "STP", "STP|SMP", "SSP",
> - "SSP|SMP", "SSP|STP", "SSP|STP|SMP",
> -};
> -
> -#define DIRECT_ROUTING 0
> -#define SUBTRACTIVE_ROUTING 1
> -#define TABLE_ROUTING 2
> -
> -static const char *routing_attr[8] = {
> - [DIRECT_ROUTING] = "D",
> - [SUBTRACTIVE_ROUTING] = "S",
> - [TABLE_ROUTING] = "T",
> - [3 ... 7] = "x",
> -};
> -
> -static const char *conn_type[0x80] = {
> - [0] = "No information",
> - [1] = "SAS external receptacle (i.e., SFF-8470)(see SAS-1.1)",
> - [2] = "SAS external compact receptacle (i.e., SFF-8088)(see SAS-1.1)",
> - [3 ... 0x0f ] = "External connector",
> - [0x10] = "SAS internal wide plug (i.e., SFF-8484)(see SAS-1.1)",
> - [0x11] = "SAS internal compact wide plug (i.e., SFF-8087)(see SAS-1.1)",
> - [0x12 ... 0x1f] = "Internal wide connector",
> - [0x20] = "SAS backplane receptacle (i.e., SFF-8482)(see SAS-1.1)",
> - [0x21] = "SATA-style host plug (i.e., ATA/ATAPI-7 V3)(see SAS-1.1)",
> - [0x22] = "SAS plug (i.e., SFF-8482)(see SAS-1.1)",
> - [0x23] = "SATA device plug (i.e., ATA/ATAPI-7 V3)(see SAS-1.1)",
> - [0x24 ... 0x2f] = "Internal connector to end device",
> - [0x30 ... 0x6f] = "Unknown\n",
> - [0x70 ... 0x7f] = "Vendor specific",
> -};
> -
> -static int discover_phy(char *smp_portal_name, int phy_id, struct expander *ex)
> -{
> - int res;
> - const char *dev_str;
> -
> - disc_req[9] = phy_id;
> -
> - res = do_smp_func(smp_portal_name, disc_req, DISCOVER_REQ_SIZE,
> - disc_resp, DISCOVER_RESP_SIZE);
> -
> - if (res != DISCOVER_RESP_SIZE) {
> - printf("%s: error disovering phy %d\n", prog, phy_id);
> - goto out;
> - }
> - switch (disc_resp[2]) {
> - case PHY_VACANT:
> - printf("phy%02d: vacant\n", phy_id);
> - goto out; break;
> - case PHY_EEXIST:
> - printf("phy%02d doesn't exist\n", phy_id);
> - goto out; break;
> - case 0:
> - break;
> - default:
> - printf("phy%02d SMP function result: 0x%x\n",
> - phy_id, disc_resp[2]);
> - goto out;
> - }
> -
> - printf("Phy%02d:%s attached: %016llx:%02d chg count:%02d\n",
> - phy_id, routing_attr[disc_resp[44] & 0x0F],
> - SAS_ADDR(disc_resp+24), disc_resp[32], disc_resp[42]);
> -
> - if (ex->phy_attr)
> - ex->phy_attr[phy_id] = disc_resp[44] & 0x0F;
> -
> - if (disc_resp[14] & 1)
> - dev_str = "SATA Host";
> - else if (disc_resp[15] & 0x80)
> - dev_str = "SATA Port Selector";
> - else if (disc_resp[15] & 1)
> - dev_str = "SATA device";
> - else
> - dev_str = attached_dev_type[(disc_resp[12] & 0x70) >> 4];
> - printf(" Attached device: %15s Link rate: %15s\n",
> - dev_str, phy_link_rate[disc_resp[13] & 0xf]);
> -
> - printf(" Tproto: %15s Iproto: %15s\n",
> - proto_table[(disc_resp[15] & 0xe) >> 1],
> - proto_table[(disc_resp[14] & 0xe) >> 1]);
> -
> - printf(" Programmed MIN-MAX linkrate: %s - %s\n",
> - phy_link_rate[(disc_resp[40] & 0xF0)>>4],
> - phy_link_rate[(disc_resp[41] & 0xF0)>>4]);
> -
> - printf(" Hardware MIN-MAX linkrate: %s - %s\n",
> - phy_link_rate[(disc_resp[40] & 0x0F)],
> - phy_link_rate[(disc_resp[41] & 0x0F)]);
> -
> - printf(" %s phy\n", (disc_resp[43] & 0x80) ? "Virtual" : "Physical");
> - printf(" Partial pathway timeout value: %d microseconds\n",
> - disc_resp[43] & 0x0F);
> -
> - printf(" Connector type: %s\n", conn_type[disc_resp[45] & 0x7F]);
> - printf(" Connector element index: %d\n", disc_resp[46]);
> - printf(" Connector physical link: %d\n", disc_resp[47]);
> -out:
> - return 0;
> -}
> -
> -#define RPEL_REQ_SIZE 16
> -#define RPEL_RESP_SIZE 32
> -
> -static unsigned char rpel_req[RPEL_REQ_SIZE] = { 0x40, 0x11, 0, };
> -static unsigned char rpel_resp[RPEL_RESP_SIZE];
> -
> -static int report_phy_error_log(char *smp_portal_name, int phy_id)
> -{
> - int res;
> -
> - rpel_req[9] = phy_id;
> -
> - res = do_smp_func(smp_portal_name, rpel_req, RPEL_REQ_SIZE,
> - rpel_resp, RPEL_RESP_SIZE);
> - if (res != RPEL_RESP_SIZE) {
> - printf("%s: error reading error log for phy %d (%d)\n",
> - prog, phy_id, res);
> - goto out;
> - }
> - MI_PRINTD(" Invalid DW count:", be32_to_cpu(rpel_resp[12]));
> - MI_PRINTD(" RD error count:", be32_to_cpu(rpel_resp[16]));
> - MI_PRINTD(" DW sync loss count:", be32_to_cpu(rpel_resp[20]));
> - MI_PRINTD(" Reset problem count:", be32_to_cpu(rpel_resp[24]));
> -out:
> - return 0;
> -}
> -
> -#define RRI_REQ_SIZE 16
> -#define RRI_RESP_SIZE 44
> -
> -static unsigned char rri_req[RRI_REQ_SIZE] = { 0x40, 0x13, 0, };
> -static unsigned char rri_resp[RRI_RESP_SIZE];
> -
> -static int show_routing_table(char *smp_portal_name, int phy_id,
> - struct expander *ex)
> -{
> - struct route_table_entry *rt;
> - int res, i, last_non_zero = -1;
> -
> - if (!ex->phy_attr || ex->phy_attr[phy_id] != TABLE_ROUTING)
> - return 0;
> -
> - rt = malloc(sizeof(struct route_table_entry)*ex->route_indexes);
> - if (!rt)
> - return 0;
> -
> - rri_req[9] = phy_id;
> -
> - for (i = 0; i < ex->route_indexes; i++) {
> - *(uint16_t *)(rri_req+6) = cpu_to_be16(i);
> - res = do_smp_func(smp_portal_name, rri_req, RRI_REQ_SIZE,
> - rri_resp, RRI_RESP_SIZE);
> - if (res != RRI_RESP_SIZE) {
> - printf("Error getting phy %d route index %d (%d)\n",
> - phy_id, i, res);
> - goto out;
> - }
> - if (rri_resp[2] != 0)
> - break;
> - if (be16_to_cpu(rri_resp[6]) != i) {
> - printf("Expander FW error for phy %d index %d\n",
> - phy_id, i);
> - goto out;
> - }
> - rt[i].disabled = rri_resp[12] & 0x80 ? 1 : 0;
> - memcpy(rt[i].routed_sas_addr, rri_resp+16, SAS_ADDR_SIZE);
> - if (rt[i].routed_sas_addr[0])
> - last_non_zero = i;
> - }
> - printf(" Routing Table\n");
> - if (last_non_zero == -1)
> - printf(" Empty (all zero)\n");
> - else {
> - for (i = 0; i <= last_non_zero; i++)
> - printf(" %02d %8s %016llx\n",
> - i, rt[i].disabled ? "disabled" : "enabled",
> - SAS_ADDR(rt[i].routed_sas_addr));
> - }
> -out:
> - free(rt);
> - return 0;
> -}
> -
> -static int discover_expander(char *smp_portal_name, struct expander *ex)
> -{
> - int i;
> -
> - for (i = 0; i < ex->num_phys; i++) {
> - printf("\n");
> - discover_phy(smp_portal_name, i, ex);
> - report_phy_error_log(smp_portal_name, i);
> - show_routing_table(smp_portal_name, i, ex);
> - }
> -
> - return 0;
> -}
> -
> -static void print_info(void)
> -{
> - printf("%s <smp portal file>\n", prog);
> - printf("\tWhere <smp portal file> is the binary attribute file of the"
> - "\n\texpander device in sysfs.\n");
> -}
> -
> -int main(int argc, char *argv[])
> -{
> - prog = strrchr(argv[0], '/');
> - if (prog)
> - prog++;
> - else
> - prog = argv[0];
> -
> - if (argc < 2) {
> - print_info();
> - return 0;
> - } else {
> - struct expander ex;
> -
> - memset(&ex, 0, sizeof(ex));
> -
> - mi_expander(argv[1], &ex);
> - rg_expander(argv[1], &ex);
> - discover_expander(argv[1], &ex);
> - if (ex.phy_attr)
> - free(ex.phy_attr);
> - }
> - return 0;
> -}
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2006-05-10 6:56 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-09 21:13 [PATCH 0/8] aic94xx: sas code clean-up Alexis Bruemmer
2006-05-09 21:20 ` [PATCH 1/8] aic94xx: move sas README Alexis Bruemmer
2006-05-09 21:25 ` [PATCH 2/8] aic94xx: remove the sas_common.c file Alexis Bruemmer
2006-05-09 21:27 ` [PATCH 3/8] aic94xx: remove the //depot SCM comments Alexis Bruemmer
2006-05-09 21:31 ` [PATCH 4/8] aic94xx: remove expander_conf.c Alexis Bruemmer
2006-05-10 6:56 ` Luben Tuikov [this message]
2006-05-09 21:33 ` [PATCH 5/8] aic94xx: remove inline functions Alexis Bruemmer
2006-05-09 21:37 ` [PATCH 6/8] aic94xx: move list_each_entry_reverse_safe from sas_discover.h to list.h Alexis Bruemmer
2006-05-10 7:01 ` Luben Tuikov
2006-05-10 7:07 ` Luben Tuikov
2006-05-09 21:39 ` [PATCH 7/8] aic94xx: remove queue implementation comment Alexis Bruemmer
2006-05-10 7:09 ` Luben Tuikov
2006-05-09 21:42 ` [PATCH 8/8] aic94xx: use bitops for testing, setting and clearing bits Alexis Bruemmer
2006-05-09 21:53 ` Rolf Eike Beer
2006-05-10 6:53 ` [PATCH 0/8] aic94xx: sas code clean-up Luben Tuikov
2006-05-10 7:21 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060510065639.36451.qmail@web31802.mail.mud.yahoo.com \
--to=ltuikov@yahoo.com \
--cc=alexisb@us.ibm.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox