#include #include #include #include #include #include #include #include char blob_name[] = "isci_firmware.bin"; char id[] = "#SCU MAGIC#"; unsigned char version = 1; unsigned char sub_version = 0; /* * For all defined arrays: * elements 0-3 are for SCU0, ports 0-3 * elements 4-7 are for SCU1, ports 0-3 * * valid configurations for one SCU are: * P0 P1 P2 P3 * ---------------- * 0xF,0x0,0x0,0x0 # 1 x4 port * 0x3,0x0,0x4,0x8 # Phys 0 and 1 are a x2 port, phy 2 and phy 3 are each x1 * # ports * 0x1,0x2,0xC,0x0 # Phys 0 and 1 are each x1 ports, phy 2 and phy 3 are a x2 * # port * 0x3,0x0,0xC,0x0 # Phys 0 and 1 are a x2 port, phy 2 and phy 3 are a x2 port * 0x1,0x2,0x4,0x8 # Each phy is a x1 port (this is the default configuration) * * if there is a port/phy on which you do not wish to override the default * values, use the value assigned to UNINIT_PARAM (255). */ unsigned int phy_mask[] = { 1, 2, 4, 8, 1, 2, 4, 8 }; /* denotes SAS generation. i.e. 3: SAS Gen 3 6G */ unsigned int phy_gen[] = { 3, 3, 3, 3, 3, 3, 3, 3 }; /* * if there is a port/phy on which you do not wish to override the default * values, use the value "0000000000000000". SAS address of zero's is * considered invalid and will not be used. */ unsigned long long sas_addr[] = { 0x5FCFFFFFF0000000ULL, 0x5FCFFFFFF1000000ULL, 0x5FCFFFFFF2000000ULL, 0x5FCFFFFFF3000000ULL, 0x5FCFFFFFF4000000ULL, 0x5FCFFFFFF5000000ULL, 0x5FCFFFFFF6000000ULL, 0x5FCFFFFFF7000000ULL }; int write_blob(void) { FILE *fd; int err; fd = fopen(blob_name, "w+"); if (!fd) { perror("Open file for write failed"); return -EIO; } /* write id */ err = fwrite((void *)id, sizeof(char), strlen(id)+1, fd); if (err == 0) { perror("write id failed"); return err; } /* write version */ err = fwrite((void *)&version, sizeof(version), 1, fd); if (err == 0) { perror("write version failed"); return err; } /* write sub version */ err = fwrite((void *)&sub_version, sizeof(sub_version), 1, fd); if (err == 0) { perror("write subversion failed"); return err; } /* write phy mask header */ err = fputc(0x1, fd); if (err == EOF) { perror("write phy mask header failed"); return -EIO; } /* write size */ err = fputc(8, fd); if (err == EOF) { perror("write phy mask size failed"); return -EIO; } /* write phy masks */ err = fwrite((void *)phy_mask, 1, sizeof(phy_mask), fd); if (err == 0) { perror("write phy_mask failed"); return err; } /* write phy gen header */ err = fputc(0x2, fd); if (err == EOF) { perror("write phy gen header failed"); return -EIO; } /* write size */ err = fputc(8, fd); if (err == EOF) { perror("write phy gen size failed"); return -EIO; } /* write phy_gen */ err = fwrite((void *)phy_gen, 1, sizeof(phy_gen), fd); if (err == 0) { perror("write phy_gen failed"); return err; } /* write phy gen header */ err = fputc(0x3, fd); if (err == EOF) { perror("write sas addr header failed"); return -EIO; } /* write size */ err = fputc(8, fd); if (err == EOF) { perror("write sas addr size failed"); return -EIO; } /* write sas_addr */ err = fwrite((void *)sas_addr, 1, sizeof(sas_addr), fd); if (err == 0) { perror("write sas_addr failed"); return err; } /* write end header */ err = fputc(0xff, fd); if (err == EOF) { perror("write end header failed"); return -EIO; } fclose(fd); return 0; } int main(void) { int err; err = write_blob(); if (err < 0) return err; return 0; }