Re: [PATCH] mvsas: fix wrong endianness of sgpio api

2018-03-02 Thread Wilfried Weissmann

Hello Martin,

Thanks, and I promise to keep on working hard on not falling over my own feet 
doing a git send-email!

Am 02.03.18 um 03:09 schrieb Martin K. Petersen:


Wilfried,


This patch fixes the byte order of the SGPIO api and brings it back in
sync with ledmon v0.80 and above.


The patch was missing your Signed-off-by: tag. I added it and applied
patch to 4.17/scsi-queue.



[PATCH] mvsas: fix wrong endianness of sgpio api

2018-02-23 Thread Wilfried . Weissmann
From: Wilfried Weissmann <wilfried.weissm...@gmx.at>

This patch fixes the byte order of the SGPIO api and brings it back
in sync with ledmon v0.80 and above.
---
 drivers/scsi/mvsas/mv_94xx.c | 23 ---
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/mvsas/mv_94xx.c b/drivers/scsi/mvsas/mv_94xx.c
index 7de5d8d75..84a638a90 100644
--- a/drivers/scsi/mvsas/mv_94xx.c
+++ b/drivers/scsi/mvsas/mv_94xx.c
@@ -1080,16 +1080,16 @@ static int mvs_94xx_gpio_write(struct mvs_prv_info 
*mvs_prv,
void __iomem *regs = mvi->regs_ex - 0x10200;
 
int drive = (i/3) & (4-1); /* drive number on host */
-   u32 block = mr32(MVS_SGPIO_DCTRL +
+   int driveshift = drive * 8; /* bit offset of drive */
+   u32 block = ioread32be(regs + MVS_SGPIO_DCTRL +
MVS_SGPIO_HOST_OFFSET * mvi->id);
 
-
/*
* if bit is set then create a mask with the first
* bit of the drive set in the mask ...
*/
-   u32 bit = (write_data[i/8] & (1 << (i&(8-1 ?
-   1<<(24-drive*8) : 0;
+   u32 bit = get_unaligned_be32(write_data) & (1<<i) ?
+   1<id,
-   block);
+   iowrite32be(block,
+   regs + MVS_SGPIO_DCTRL +
+   MVS_SGPIO_HOST_OFFSET * mvi->id);
 
}
 
@@ -1132,7 +1133,7 @@ static int mvs_94xx_gpio_write(struct mvs_prv_info 
*mvs_prv,
void __iomem *regs = mvi->regs_ex - 0x10200;
 
mw32(MVS_SGPIO_DCTRL + MVS_SGPIO_HOST_OFFSET * mvi->id,
-   be32_to_cpu(((u32 *) write_data)[i]));
+   ((u32 *) write_data)[i]);
}
return reg_count;
}


Re: [PATCH] mvsas: fix wrong endianess of sgpio api

2018-02-21 Thread Wilfried Weissmann

Hi,

OK. I will fix that and send a new patch.

Greetings,
Wilfried Weissmann


[PATCH] mvsas: fix wrong endianess of sgpio api

2018-02-19 Thread Wilfried . Weissmann
From: Wilfried Weissmann <wilfried.weissm...@gmx.at>

---
 drivers/scsi/mvsas/mv_94xx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/mvsas/mv_94xx.c b/drivers/scsi/mvsas/mv_94xx.c
index 7de5d8d75..926086f39 100644
--- a/drivers/scsi/mvsas/mv_94xx.c
+++ b/drivers/scsi/mvsas/mv_94xx.c
@@ -1088,7 +1088,7 @@ static int mvs_94xx_gpio_write(struct mvs_prv_info 
*mvs_prv,
* if bit is set then create a mask with the first
* bit of the drive set in the mask ...
*/
-   u32 bit = (write_data[i/8] & (1 << (i&(8-1 ?
+   u32 bit = (write_data[3-(i/8)] & (1 << (i&(8-1 ?
1<<(24-drive*8) : 0;
 
/*
@@ -1132,7 +1132,7 @@ static int mvs_94xx_gpio_write(struct mvs_prv_info 
*mvs_prv,
void __iomem *regs = mvi->regs_ex - 0x10200;
 
mw32(MVS_SGPIO_DCTRL + MVS_SGPIO_HOST_OFFSET * mvi->id,
-   be32_to_cpu(((u32 *) write_data)[i]));
+   le32_to_cpu(((u32 *) write_data)[i]));
}
return reg_count;
}


[PATCH] mvsas: fix wrong endianess of sgpio api

2018-02-19 Thread Wilfried . Weissmann
The SGPIO api is little endian. This patch fixes the byte order
and brings it back to sync with ledmon v0.80 and above.



Re: [PATCH 1/1] mvsas: add SGPIO support to Marvell 94xx

2015-12-27 Thread Wilfried Weissmann

add SGPIO support to Marvell 94xx

Signed-off-by: Wilfried Weissmann <wilfried.weissm...@gmx.at>
---

rebased to 
http://git.kernel.org/cgit/linux/kernel/git/mkp/scsi.git/log/?h=4.5/scsi-queue
changed enum sgpio_led_status members to uppercase


 drivers/scsi/mvsas/mv_94xx.c |  134 +
 drivers/scsi/mvsas/mv_94xx.h |   71 +
 drivers/scsi/mvsas/mv_init.c |2
 drivers/scsi/mvsas/mv_sas.c  |   13 +++
 drivers/scsi/mvsas/mv_sas.h  |5 +
 5 files changed, 225 insertions(+)

diff --git a/drivers/scsi/mvsas/mv_94xx.c b/drivers/scsi/mvsas/mv_94xx.c
index 9270d15..f6fc4a7 100644
--- a/drivers/scsi/mvsas/mv_94xx.c
+++ b/drivers/scsi/mvsas/mv_94xx.c
@@ -330,6 +330,51 @@ static void mvs_94xx_phy_enable(struct mvs_info *mvi, u32 
phy_id)
mvs_write_port_vsr_data(mvi, phy_id, tmp & 0xfd7f);
 }
 
+static void mvs_94xx_sgpio_init(struct mvs_info *mvi)

+{
+   void __iomem *regs = mvi->regs_ex - 0x10200;
+   u32 tmp;
+
+   tmp = mr32(MVS_HST_CHIP_CONFIG);
+   tmp |= 0x100;
+   mw32(MVS_HST_CHIP_CONFIG, tmp);
+
+   mw32(MVS_SGPIO_CTRL + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   MVS_SGPIO_CTRL_SDOUT_AUTO << MVS_SGPIO_CTRL_SDOUT_SHIFT);
+
+   mw32(MVS_SGPIO_CFG1 + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   8 << MVS_SGPIO_CFG1_LOWA_SHIFT |
+   8 << MVS_SGPIO_CFG1_HIA_SHIFT |
+   4 << MVS_SGPIO_CFG1_LOWB_SHIFT |
+   4 << MVS_SGPIO_CFG1_HIB_SHIFT |
+   2 << MVS_SGPIO_CFG1_MAXACTON_SHIFT |
+   1 << MVS_SGPIO_CFG1_FORCEACTOFF_SHIFT
+   );
+
+   mw32(MVS_SGPIO_CFG2 + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   (30 / 100) << MVS_SGPIO_CFG2_CLK_SHIFT | /* 100kHz clock */
+   66 << MVS_SGPIO_CFG2_BLINK_SHIFT /* (66 * 0,121 Hz?)*/
+   );
+
+   mw32(MVS_SGPIO_CFG0 + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   MVS_SGPIO_CFG0_ENABLE |
+   MVS_SGPIO_CFG0_BLINKA |
+   MVS_SGPIO_CFG0_BLINKB |
+   /* 3*4 data bits / PDU */
+   (12 - 1) << MVS_SGPIO_CFG0_AUT_BITLEN_SHIFT
+   );
+
+   mw32(MVS_SGPIO_DCTRL + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   DEFAULT_SGPIO_BITS);
+
+   mw32(MVS_SGPIO_DSRC + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   ((mvi->id * 4) + 3) << (8 * 3) |
+   ((mvi->id * 4) + 2) << (8 * 2) |
+   ((mvi->id * 4) + 1) << (8 * 1) |
+   ((mvi->id * 4) + 0) << (8 * 0));
+
+}
+
 static int mvs_94xx_init(struct mvs_info *mvi)
 {
void __iomem *regs = mvi->regs;
@@ -533,6 +578,8 @@ static int mvs_94xx_init(struct mvs_info *mvi)
/* Enable SRS interrupt */
mw32(MVS_INT_MASK_SRS_0, 0x);
 
+	mvs_94xx_sgpio_init(mvi);

+
return 0;
 }
 
@@ -1005,6 +1052,92 @@ static void mvs_94xx_tune_interrupt(struct mvs_info *mvi, u32 time)
 
 }
 
+static int mvs_94xx_gpio_write(struct mvs_prv_info *mvs_prv,

+   u8 reg_type, u8 reg_index,
+   u8 reg_count, u8 *write_data)
+{
+   int i;
+
+   switch (reg_type) {
+
+   case SAS_GPIO_REG_TX_GP:
+   if (reg_index == 0)
+   return -EINVAL;
+
+   if (reg_count > 1)
+   return -EINVAL;
+
+   if (reg_count == 0)
+   return 0;
+
+   /* maximum supported bits = hosts * 4 drives * 3 bits */
+   for (i = 0; i < mvs_prv->n_host * 4 * 3; i++) {
+
+   /* select host */
+   struct mvs_info *mvi = mvs_prv->mvi[i/(4*3)];
+
+   void __iomem *regs = mvi->regs_ex - 0x10200;
+
+   int drive = (i/3) & (4-1); /* drive number on host */
+   u32 block = mr32(MVS_SGPIO_DCTRL +
+   MVS_SGPIO_HOST_OFFSET * mvi->id);
+
+
+   /*
+   * if bit is set then create a mask with the first
+   * bit of the drive set in the mask ...
+   */
+   u32 bit = (write_data[i/8] & (1 << (i&(8-1 ?
+   1<<(24-drive*8) : 0;
+
+   /*
+   * ... and then shift it to the right position based
+   * on the led type (activity/id/fail)
+   */
+   switch (i%3) {
+   case 0: /* activity */
+   block &= ~((0x7 << MVS_SGPIO_DCTRL_ACT_SHIFT)
+   << (24-drive*8));
+   /* hardwire activity bit to SOF */
+   block |= LED_BLINKA_SOF << (
+

Re: [PATCH 1/1] mvsas: add SGPIO support to Marvell 94xx

2015-12-27 Thread Wilfried Weissmann

Am 27.12.15 um 20:42 schrieb James Bottomley:

On Sun, 2015-12-27 at 20:21 +0100, Wilfried Weissmann wrote:

add SGPIO support to Marvell 94xx


How do you actually use this?  It doesn't seem to be plumbed into the
standard GPIO subsystem and there appears to be no user accessible
interface for it either (nor is it used internally).

There doesn't appear to be much point adding an unusable feature.


sas_domain_function_template.lldd_write_gpio exposes the interface to libsas. 
Userspace access is then done via ioctl(SG_IO,...). Existing user space tools 
such as ledmon use this method, also smp_utils in case you want to have more 
direct control.

Greetings,
Wilfried
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/1] mvsas: add SGPIO support to Marvell 94xx

2015-11-13 Thread Wilfried Weissmann

add SGPIO support to Marvell 94xx

Signed-off-by: Wilfried Weissmann <wilfried.weissm...@gmx.at>
---

 drivers/scsi/mvsas/mv_94xx.c |  134 +
 drivers/scsi/mvsas/mv_94xx.h |   71 +
 drivers/scsi/mvsas/mv_init.c |2
 drivers/scsi/mvsas/mv_sas.c  |   13 +++
 drivers/scsi/mvsas/mv_sas.h  |5 +
 5 files changed, 225 insertions(+)

diff --git a/drivers/scsi/mvsas/mv_94xx.c b/drivers/scsi/mvsas/mv_94xx.c
index 9270d15..35ea54c 100644
--- a/drivers/scsi/mvsas/mv_94xx.c
+++ b/drivers/scsi/mvsas/mv_94xx.c
@@ -330,6 +330,51 @@ static void mvs_94xx_phy_enable(struct mvs_info *mvi, u32 
phy_id)
mvs_write_port_vsr_data(mvi, phy_id, tmp & 0xfd7f);
 }
 
+static void mvs_94xx_sgpio_init(struct mvs_info *mvi)

+{
+   void __iomem *regs = mvi->regs_ex - 0x10200;
+   u32 tmp;
+
+   tmp = mr32(MVS_HST_CHIP_CONFIG);
+   tmp |= 0x100;
+   mw32(MVS_HST_CHIP_CONFIG, tmp);
+
+   mw32(MVS_SGPIO_CTRL + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   MVS_SGPIO_CTRL_SDOUT_AUTO << MVS_SGPIO_CTRL_SDOUT_SHIFT);
+
+   mw32(MVS_SGPIO_CFG1 + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   8 << MVS_SGPIO_CFG1_LOWA_SHIFT |
+   8 << MVS_SGPIO_CFG1_HIA_SHIFT |
+   4 << MVS_SGPIO_CFG1_LOWB_SHIFT |
+   4 << MVS_SGPIO_CFG1_HIB_SHIFT |
+   2 << MVS_SGPIO_CFG1_MAXACTON_SHIFT |
+   1 << MVS_SGPIO_CFG1_FORCEACTOFF_SHIFT
+   );
+
+   mw32(MVS_SGPIO_CFG2 + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   (30 / 100) << MVS_SGPIO_CFG2_CLK_SHIFT | /* 100kHz clock */
+   66 << MVS_SGPIO_CFG2_BLINK_SHIFT /* (66 * 0,121 Hz?)*/
+   );
+
+   mw32(MVS_SGPIO_CFG0 + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   MVS_SGPIO_CFG0_ENABLE |
+   MVS_SGPIO_CFG0_BLINKA |
+   MVS_SGPIO_CFG0_BLINKB |
+   /* 3*4 data bits / PDU */
+   (12 - 1) << MVS_SGPIO_CFG0_AUT_BITLEN_SHIFT
+   );
+
+   mw32(MVS_SGPIO_DCTRL + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   DEFAULT_SGPIO_BITS);
+
+   mw32(MVS_SGPIO_DSRC + MVS_SGPIO_HOST_OFFSET * mvi->id,
+   ((mvi->id * 4) + 3) << (8 * 3) |
+   ((mvi->id * 4) + 2) << (8 * 2) |
+   ((mvi->id * 4) + 1) << (8 * 1) |
+   ((mvi->id * 4) + 0) << (8 * 0));
+
+}
+
 static int mvs_94xx_init(struct mvs_info *mvi)
 {
void __iomem *regs = mvi->regs;
@@ -533,6 +578,8 @@ static int mvs_94xx_init(struct mvs_info *mvi)
/* Enable SRS interrupt */
mw32(MVS_INT_MASK_SRS_0, 0x);
 
+	mvs_94xx_sgpio_init(mvi);

+
return 0;
 }
 
@@ -1005,6 +1052,92 @@ static void mvs_94xx_tune_interrupt(struct mvs_info *mvi, u32 time)
 
 }
 
+static int mvs_94xx_gpio_write(struct mvs_prv_info *mvs_prv,

+   u8 reg_type, u8 reg_index,
+   u8 reg_count, u8 *write_data)
+{
+   int i;
+
+   switch (reg_type) {
+
+   case SAS_GPIO_REG_TX_GP:
+   if (reg_index == 0)
+   return -EINVAL;
+
+   if (reg_count > 1)
+   return -EINVAL;
+
+   if (reg_count == 0)
+   return 0;
+
+   /* maximum supported bits = hosts * 4 drives * 3 bits */
+   for (i = 0; i < mvs_prv->n_host * 4 * 3; i++) {
+
+   /* select host */
+   struct mvs_info *mvi = mvs_prv->mvi[i/(4*3)];
+
+   void __iomem *regs = mvi->regs_ex - 0x10200;
+
+   int drive = (i/3) & (4-1); /* drive number on host */
+   u32 block = mr32(MVS_SGPIO_DCTRL +
+   MVS_SGPIO_HOST_OFFSET * mvi->id);
+
+
+   /*
+   * if bit is set then create a mask with the first
+   * bit of the drive set in the mask ...
+   */
+   u32 bit = (write_data[i/8] & (1 << (i&(8-1 ?
+   1<<(24-drive*8) : 0;
+
+   /*
+   * ... and then shift it to the right position based
+   * on the led type (activity/id/fail)
+   */
+   switch (i%3) {
+   case 0: /* activity */
+   block &= ~((0x7 << MVS_SGPIO_DCTRL_ACT_SHIFT)
+   << (24-drive*8));
+   /* hardwire activity bit to SOF */
+   block |= led_blinka_sof << (
+   MVS_SGPIO_DCTRL_ACT_SHIFT +
+   (24-drive*8));
+